找回密码
 立即注册
查看: 684|回复: 3

STC8H8K64U的USB和串口3不能同时使用问题

[复制链接]
  • TA的每日心情
    开心
    昨天 10:59
  • 签到天数: 1 天

    [LV.1]初来乍到

    5

    主题

    8

    回帖

    112

    积分

    注册会员

    积分
    112
    发表于 2023-2-22 17:56:10 | 显示全部楼层 |阅读模式
    最近调试一个产品,USB-HID和串口3同时用上了,调试时出现这个问题。

    USB-HID 和 串口3同时使用,USB-HID发送的数据会被串口3接收到。

    例如:按一个按键,然后串口发送0x31,同时使用SSCOM发送一串数据到设备,设备会接收到0x31和很多乱的数据,初步估计时USB-HID口串过来的。测试步骤如下:
    1: 按下按键1,往串口3发送0x31.
    2: 然后使用SSCOM方式数据。
    3: 设备识别到命令错误,然后把串口接收的缓存数据发送到PC,通过SSCOM观察到。

    代码如下:
    按键扫描,有数据的话,往USB、PS2、串口发送数据。

    void KeyboardScan(void)
    {               
            MainKeyPressScan();       
            ProcessMainKeyForUSB();
            ProcessMainKeyForUart();
            ProcessMainKeyForPS2();       
                   
            MainKeyPressStructure.KeyPressCode = 0;
            MainKeyPressStructure.KeyPressSuccess = ERROR;
    }


    USB发送数据函数:

    void        ProcessMainKeyForUSB(void)
    {
            u8 keycode,KeyData;
           
            if( MainKeyPressStructure.KeyPressSuccess == ERROR )
                    return;               
            keycode = AnalyzeMainKeyCode( MainKeyPressStructure.KeyPressCode );                //测试OK       
            KeyData = GetMainKeyHIDValueFromFlash(keycode);                               
            USBSendData(KeyData);               
    }


    串口3发送数据:

    void        ProcessMainKeyForUart(void)
    {        u8 keycode,KeyData;       
            if( MainKeyPressStructure.KeyPressSuccess == ERROR )
                    return;               
            keycode = AnalyzeMainKeyCode( MainKeyPressStructure.KeyPressCode );               
            KeyData = GetMainKeyASCIIValueFromFlash(keycode);                               
            Uart3Send8Bit(KeyData);
    }


    在串口命令函数里,有这一段代码,接收到错误的命令时,把串口缓存的数据通过串口3发送到PC。

            if( (ReceiveUartCMDStructure.ReceivedCMDDataBuffer[COM_DATA_START_POS] != COM_DATA_START ) ||                //核对数据起始和结束是否正确
                    (ReceiveUartCMDStructure.ReceivedCMDDataBuffer[COM_DATA_END_POS] != COM_DATA_END ))
                            {
                                    Uart_SendBytes("COMMAND ERROR", 13);
                                   
                                    Uart3Send8Bit(0xFF);
                                    for(i=0; i<ReceiveUartCMDStructure.ReceivedCMDDataLength; i++)
                                            Uart3Send8Bit(ReceiveUartCMDStructure.ReceivedCMDDataBuffer[i]);
                                    Uart3Send8Bit(0xFF);
                                   
                                    InitReceiveUartCMDStructure();                               
                                    return ;
                            }       

    数据:
    31 31 43 4F 4D 4D 41 4E 44 20 45 52 52 4F 52 FF 31 31 AA FD 31 32 33 41 34 35 36 42 37 38 39 43 44 30 45 46 BB 55 00 00 00 8D AB 06 28 7C F2 00 03 C9 D8 46 00 DB 64 00 00 00 79 C0 21 DA 9A 6B CB FD D8 0C 41 11 C6 16 66 F7 F0 5E 50 FB B5 A4 94 64 D5 40 4E 83 C0 F9 5C 74 75 6C EC F0 47 6D 8C 70 81 1E D2 FF

    数据解析:
    1: 31 31 是串口发送的按键"1"数据。
    2: 43 4F 4D 4D 41 4E 44 20 45 52 52 4F 52是字符串“COMMAND ERROR”。
    3: FF是上面代码发的。
    4: 31 31 AA FD 31 32 33 41 34 35 36 42 37 38 39 43 44 30 45 46 BB是串口接收到PC的命令数据。
    5: 55 00 00 00 8D AB 06 28 7C F2 00 03 C9 D8 46 00 DB 64 00 00 00 79 C0 21 DA 9A 6B CB FD D8 0C 41 11 C6 16 66 F7 F0 5E 50 FB B5 A4 94 64 D5 40 4E 83 C0 F9 5C 74 75 6C EC F0 47 6D 8C 70 81 1E D2 FF是串口接收到的乱码,初步判断是USB带过来的。

    解决方法如下:
    1: USB不通讯,仅供电,串口3正常收发数据。
    2: 屏蔽函数 ProcessMainKeyForUSB(),串口3正常收发数据。

    没试过其它串口,串口1和USB是共用PIN脚的,但怎么会影响其它串口呢?
    现在的问题是,怎么解决?论坛里有人碰到过吗?



    回复 送花

    使用道具 举报

  • TA的每日心情
    奋斗
    前天 08:59
  • 签到天数: 154 天

    [LV.7]常住居民III

    27

    主题

    1408

    回帖

    4382

    积分

    论坛元老

    积分
    4382
    发表于 2023-2-23 10:34:35 | 显示全部楼层


    STC官网开天斧例程包里面,例程“06-串口3与串口4通信测试程序”就同时使用USB-HID、串口3、串口4。
    到官网下载这个例程试试。
    https://www.stcai.com/hxgnsyb

  • TA的每日心情
    开心
    昨天 10:59
  • 签到天数: 1 天

    [LV.1]初来乍到

    5

    主题

    8

    回帖

    112

    积分

    注册会员

    积分
    112
     楼主| 发表于 2023-2-23 19:46:12 | 显示全部楼层
    乘风飞扬 发表于 2023-2-23 10:34
    STC官网开天斧例程包里面,例程“06-串口3与串口4通信测试程序”就同时使用USB-HID、串口3、串口4。
    到官 ...

    感谢您的回复。
    看了这个例程,没有找到USB相关的代码,只有调用几个函数,没有函数具体内容。
  • TA的每日心情
    奋斗
    前天 08:59
  • 签到天数: 154 天

    [LV.7]常住居民III

    27

    主题

    1408

    回帖

    4382

    积分

    论坛元老

    积分
    4382
    发表于 2023-2-24 10:35:24 | 显示全部楼层
    古人来者_昌 发表于 2023-2-23 19:46
    感谢您的回复。
    看了这个例程,没有找到USB相关的代码,只有调用几个函数,没有函数具体内容。 ...

    这个例程用的是USB-HID库文件,连接电脑就能识别出USB HID设备,通过USB接口给MCU发送 "@STCISP#"命令就能触发MCU复位。
    此外开启主循环里下面屏蔽的两行代码,就可以通过USB接口接收数据并原样返回,实现USB HID的收发通信:
    1.         if (bUsbOutReady) //USB调试及复位所需代码
    2.         {
    3. //            memcpy(UsbInBuffer, UsbOutBuffer, 64);      //原路返回, 用于测试HID
    4. //            usb_IN();
    5.             
    6.             usb_OUT_done();
    7.         }
    复制代码

    1.png
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

    GMT+8, 2024-6-2 02:33 , Processed in 0.061995 second(s), 43 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

    快速回复 返回顶部 返回列表