请选择 进入手机版 | 继续访问电脑版

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

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

[复制链接]

该用户从未签到

3

主题

6

回帖

92

积分

注册会员

积分
92
发表于 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:48
  • 签到天数: 117 天

    [LV.6]常住居民II

    26

    主题

    1223

    回帖

    3827

    积分

    论坛元老

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


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

    该用户从未签到

    3

    主题

    6

    回帖

    92

    积分

    注册会员

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

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

    [LV.6]常住居民II

    26

    主题

    1223

    回帖

    3827

    积分

    论坛元老

    积分
    3827
    发表于 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-4-19 07:45 , Processed in 0.074905 second(s), 43 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

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