CH573 USB CDC SET_LINE_CODING问题

使用CH573的USB CDC串口,串口可以通讯,数据上下行正常。但是每次打开串口都会下发两次SET_LINE_CODING,数据还不一样,我抓到的打印信息如下:

CH573>>[I/USB/CDC] set line coding dataRate : 9600 , charFormat : 0 parityType : 0 dataBits : 7
[I/USB/CDC] set line coding dataRate : 8609 , charFormat : 0 parityType : 0 dataBits : 8
[I/USB/CDC] set line coding dataRate : 9600 , charFormat : 0 parityType : 0 dataBits : 7
[I/USB/CDC] set line coding dataRate : 8609 , charFormat : 0 parityType : 0 dataBits : 8

第一次的波特率是9600 第二次这个8609是怎么回事? 前面的只有波特率是正常的,后面这次波特率不对 其他的都是正确的。



部分代码如下:

            // endpoint0 out
            case UIS_TOKEN_OUT:
            {
                LOG_D("endpoint0 out -> len = %d", R8_USB_RX_LEN);
                len = R8_USB_RX_LEN;
                /* 类请求 且是 设置linecodeing*/
                if (SetupReqCode == SET_LINE_CODING)
                {
                    if (RB_U_TOG_OK)
                    {
                        Line_Coding.dwDTERate = *(uint32_t *)pEP0_DataBuf;
                        Line_Coding.bCharFormat = pEP0_DataBuf[4];
                        Line_Coding.bParityType = pEP0_DataBuf[5];
                        Line_Coding.bDataBits = pEP0_DataBuf[6];
                        LOG_I("set line coding dataRate : %ld , charFormat : %d parityType : %d dataBits : %d", Line_Coding.dwDTERate, Line_Coding.bCharFormat, Line_Coding.bParityType, Line_Coding.bDataBits);
                        R8_UEP0_T_LEN = 0;
                        R8_UEP0_CTRL |= UEP_R_RES_ACK | UEP_T_RES_ACK; // 准备上传0包
                    }
                }
                else
                {
                    R8_UEP0_T_LEN = 0;
                    R8_UEP0_CTRL |= UEP_R_RES_ACK | UEP_T_RES_NAK; //状态阶段,对IN响应NAK
                }
                R8_UEP0_CTRL ^= RB_UEP_R_TOG;                                     //同步标志位翻转
            }
            break;



通过串口助手设置不同波特率的时候下发的指令正确吗?

http://www.wch.cn/bbs/thread-71832-1.html

该链接下有CH579模拟CDC的demo,可以参考一下。


CH573>>[I/USB/CDC] set line coding dataRate : 115200 , charFormat : 0 parityType : 0 dataBits : 7
[I/USB/CDC] set line coding dataRate : 8609 , charFormat : 0 parityType : 0 dataBits : 8
[I/USB/CDC] set line coding dataRate : 115200 , charFormat : 0 parityType : 0 dataBits : 7
[I/USB/CDC] set line coding dataRate : 8609 , charFormat : 0 parityType : 0 dataBits : 8
[I/USB/CDC] set line coding dataRate : 38400 , charFormat : 0 parityType : 0 dataBits : 7
[I/USB/CDC] set line coding dataRate : 8609 , charFormat : 0 parityType : 0 dataBits : 8
[I/USB/CDC] set line coding dataRate : 38400 , charFormat : 0 parityType : 0 dataBits : 7
[I/USB/CDC] set line coding dataRate : 8609 , charFormat : 0 parityType : 0 dataBits : 8
[I/USB/CDC] set line coding dataRate : 38400 , charFormat : 0 parityType : 0 dataBits : 7
[I/USB/CDC] set line coding dataRate : 8609 , charFormat : 1 parityType : 4 dataBits : 6
[I/USB/CDC] set line coding dataRate : 38400 , charFormat : 0 parityType : 0 dataBits : 7
[I/USB/CDC] set line coding dataRate : 8609 , charFormat : 1 parityType : 4 dataBits : 6

这几条就是设置不同波特率 停止位 校验位的时候收到的数据 每次都会收到四条set line coding命令 两两重复。代码参考了ch579的实现,但是ch579没有解析set line coding命令。


你好,你可以把你的工程贴一下,或者发我的邮箱,我们帮你看一下。


发你邮箱了 收到请帮忙看一下


好的 收到


如方便,请电话025-52635387


请给个回复,这个问题我翻了USB 1.1的手册 没找到解决方法。着急 感谢


icon_rar.gifCH573_CDC_OK.rar

可以参考一下CH573_CDC压缩包,你的调试环境和复现步骤可否详细叙述。

或直接联系025-52635387


        switch ( SetupReqCode )
        {
          case 0x01 :                  //GetReport
            break;
          case 0x02 :                  //GetIdle
            break;
          case 0x03 :                  //GetProtocol
            break;
          case 0x09 :                  //SetReport
            break;
          case 0x0A :                  //SetIdle
            break;
          case 0x0B :                  //SetProtocol
            break;
          case GET_LINE_CODING :    //0x21  currently configured
            pDescr = LineCoding;
            len = sizeof( LineCoding );
            len = SetupReqLen >= DEFAULT_ENDP0_SIZE ?
                DEFAULT_ENDP0_SIZE : SetupReqLen;
            memcpy( pEP0_DataBuf, pDescr, len );
            SetupReqLen -= len;
            pDescr += len;
            break;
          case SET_CONTROL_LINE_STATE :    //0x22  generates RS-232/V.24 style control signals
            break;
          case SET_LINE_CODING :      //0x20  Configure
           // PRINT("set line coding len = %d...\n", R8_USB_RX_LEN);
            for(int i = 0; i < R8_USB_RX_LEN; i ++)
            {
              PRINT("%02x ", pEP0_DataBuf[i]);
            }
            PRINT("\n");
            break;
          default :
            errflag = 0xFF;
            break;
        }

就你附件的代码 你在

SET_LINE_CODING

里面打印一下,看一下上位机的串口软件在打开的时候串口信息是什么? 感觉串口配置信息和上位机软件的配置不一样啊。


以下是我抓到的信息。

21 20 00 00 00 00 07 00 35 00 34 00 5f 00 43 00 44 00 43 00 00 10 01 05 24 01 00 00 04 24 02 02 05 24 06 00 01 07 05 81 03 08 00 ff 09 04 01 00 02 0a 00 00 00 07 05 02 02 40 00 00 07 05 82 02 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 

21 20 00 00 00 00 07 00 35 00 34 00 5f 00 43 00 44 00 43 00 00 10 01 05 24 01 00 00 04 24 02 02 05 24 06 00 01 07 05 81 03 08 00 ff 09 04 01 00 02 0a 00 00 00 07 05 02 02 40 00 00 07 05 82 02 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00




你好,CH573模拟USB转串口,具体问题点是什么?

不能正常使用吗?如不能使用,请描述一下复现步骤和细节。

串口配置信息和上位机软件的配置信息不一致?本工程不向上配置信息,只通过USB读取上位机传下来的串口配置信息。

可以如下修改 UINT8 LineCoding[7] = { 0x00}; 



你好,遇到的问题是 上位机串口软件的配置信息读取不正确。项目需要知道当前串口上位机软件点配置信息,然后再配置CH573的串口信息(波特率 校验位 数据位 停止位)等等。但是通过SET_LINE_CODING这条指令读取的上位机串口配置信息不对,请帮忙分析一下


获取上位机PC串口调试助手的波特率等配置信息在标签获取,case UIS_TOKEN_OUT :

PC SSCOM上设置115200,8位。会打印信息如下:

1619180033193573.png

代码打印处如下:

1619180033146686.png



会打印两次

        case UIS_TOKEN_OUT :

          len = R8_USB_RX_LEN;

          for(int i = 0; i < len; i++)

          {

            printf("%02x ", pEP0_DataBuf[i]);

          }

          printf("\r\n");


00 c2 01 00 00 00 00 


00 00 00 00 01 01 07 




00 c2 01 00 00 00 00 


00 00 00 00 01 01 07 


通过处理手段 解决好了


只有登录才能回复,可以选择微信账号登录