kingqxj 发表于 2023-6-8 14:56:47

STC32G USB CDC如何主动发数据

stc提供的例程都是
if (bUsbOutReady)
      {
            usb_OUT_done();    //接收应答(固定格式)
            
            printf("OutNumber=0x%X\r\n",OutNumber);//使用 printf 函数打印接收数据长度

            //memcpy(UsbInBuffer, UsbOutBuffer, OutNumber);//将接收数据(UsbOutBuffer),复制到发送缓冲区(UsbInBuffer)
            //usb_IN(OutNumber);      //原路返回, 用于测试
      }

在这个if语句里面进行收发的。我理解是必须先收到PC的数据才能进入这个判断,然后才能发数据。
那么我现在需要主动向PC发送数据,我吧printf放到if外面循环发程序就会卡死。
看了几个例程都是在这里面发的。
有没有人知道怎么主动发送数据。说是和串口一样。用起来还是挺麻烦的。不过能调试通对于以后升级更新什么的是方便了。

weavr 发表于 2023-6-8 17:35:39

我没有USB基础,看STC这些没有注释的例程也感觉很困难,一句句扒,目前我的理解,USB是需要主机发送数据请求时响应数据,所以“主动”发送数据应该是先将要发送的数据放到发送缓冲区,然后对应的寄存器和忙标志置位,在数据被取走后会清0忙标志,下次“主动”发送数据时需要确认忙标置为0,卡死的原因可能是没有处理好忙标志。

kingqxj 发表于 2023-6-8 18:31:36

weavr 发表于 2023-6-8 17:35
我没有USB基础,看STC这些没有注释的例程也感觉很困难,一句句扒,目前我的理解,USB是需要主机发送数据请 ...
(引用自2楼)

现在发没问题了。卡死的问题还没解决。
主要是PC串口助手关闭了串口的时候USB那边就无法发送成功。printf函数就会卡住。现在知道的解决方案是给他加个超市。
但是不知道怎么加。lib库应该我们是没法改的。反正用起来挺恼火的。全走顺了后面用应该还是挺爽的。

wye11083 发表于 2023-6-8 22:06:22

usb只允许主机发出读写请求,下位机不允许占用总线。

redroof 发表于 2023-6-8 22:22:11

kingqxj 发表于 2023-6-8 18:31
现在发没问题了。卡死的问题还没解决。
主要是PC串口助手关闭了串口的时候USB那边就无法发送成功。printf ...
(引用自3楼)

USB就是这样的,从机的发送实际上主机要读才行。主机不给你发读包,你就没法送岀数据。
对USB串口来说,没有程序打开着串口要数据,你从机肯定没办法发岀数据啊
真实串口,不管别人想不想收数据,你都能发。这一点跟usb不同

kingqxj 发表于 2023-6-8 22:38:32

redroof 发表于 2023-6-8 22:22
USB就是这样的,从机的发送实际上主机要读才行。主机不给你发读包,你就没法送岀数据。
对USB串口来说, ...
(引用自5楼)

是的。现在问题是它lib封装的printf不带超时退出。程序就会被意外卡住。不知道怎么修改lib库给printf函数加个超时退出。这样就没有风险了

iamseer 发表于 2023-6-9 04:06:29

kingqxj 发表于 2023-6-8 22:38
是的。现在问题是它lib封装的printf不带超时退出。程序就会被意外卡住。不知道怎么修改lib库给printf函数 ...
(引用自6楼)

没有特别用过STC,但是“printf 重定向”了解一下。
printf底层一般是用fputc将字符串输出到正确的地方去,所以重写fputc就能加入需要的功能。

weavr 发表于 2023-6-9 08:21:21

kingqxj 发表于 2023-6-8 22:38
是的。现在问题是它lib封装的printf不带超时退出。程序就会被意外卡住。不知道怎么修改lib库给printf函数 ...
(引用自6楼)

有UsbOutReady,是否也有UsbInReady,试一下先判断UsbInReady

国学芯用 发表于 2023-6-9 09:03:23

请直接用我们提供的程序测试
超级简单的USB-CDC虚拟串口应用及不停电下载-STC32

国学芯用 发表于 2023-6-9 09:07:12

32位8051教学视频-第五集-C语言运算符和进制数入门上

电子DIY小家 发表于 2023-6-9 09:40:17

我吧printf放到if外面循环发程序就会卡死。
---这个问题其实很好理解,CDC串口区别于普通串口,CDC是usb带校验的发送所以数据量会比较大,但是普通的串口是单向的传输(没有丢包,错包的检测)。在这里你说的是卡死其实本质就是你的PRINTF函数调用过快,之前的数据还没发完新的数据就不断的丢进缓存区,不像不同的串口其实是一个一个字节的在发送,等他发完一个字节才会丢进去新的数据,cdc串口在调用的时候是整包数据丢进去的。

电子DIY小家 发表于 2023-6-9 09:51:57

要改也很简单,最简单的就是加个长点的delay就好了,或者在每次调用printf之前检测一下usb发送的状态,例如加一个   while( bUsbInBusy==1 ); 紧接着在printf就好了

kingqxj 发表于 2023-6-9 13:37:34

iamseer 发表于 2023-6-9 04:06
没有特别用过STC,但是“printf 重定向”了解一下。
printf底层一般是用fputc将字符串输出到正确的地方去 ...
(引用自7楼)

它是重定向到stc自己的printf_hid上的

kingqxj 发表于 2023-6-9 13:37:46

本帖最后由 kingqxj 于 2023-6-9 13:55 编辑

weavr 发表于 2023-6-9 08:21
有UsbOutReady,是否也有UsbInReady,试一下先判断UsbInReady
(引用自8楼)

是有这个状态位。我试一下

kingqxj 发表于 2023-6-9 13:39:13

国学芯用 发表于 2023-6-9 09:03
请直接用我们提供的程序测试
超级简单的USB-CDC虚拟串口应用及不停电下载-STC32
...
(引用自9楼)

就是用的你们的程序。现在printf重定向到hid上发送有BUG,当PC端关闭串口后程序就会在printf函数中卡住。还希望你们在库文件中修改增加一个延时参数,就是超过多少ms没有发送成功就跳出

kingqxj 发表于 2023-6-9 14:06:55

本帖最后由 kingqxj 于 2023-6-9 14:13 编辑

电子DIY小家 发表于 2023-6-9 09:51
要改也很简单,最简单的就是加个长点的delay就好了,或者在每次调用printf之前检测一下usb发送的状态,例如 ...
(引用自12楼)

谢谢。你这个方法可以。就是我发送数据的频率太高了。手动关断串口的话还是会卡死在printf中,但是这个状态位确实是检测它的

zl326498096 发表于 2023-8-25 00:16:35

kingqxj 发表于 2023-6-9 13:39
就是用的你们的程序。现在printf重定向到hid上发送有BUG,当PC端关闭串口后程序就会在printf函数中卡住。 ...
(引用自15楼)

和你遇到一样的问题,例程不清不楚,调用printf会假死。

国学芯用 发表于 2023-8-25 09:15:48

本帖最后由 国学芯用 于 2023-8-25 10:40 编辑

zl326498096 发表于 2023-8-25 00:16
和你遇到一样的问题,例程不清不楚,调用printf会假死。
(引用自17楼)

有详细的 USB 手把手教你 视频教学
https://www.stcaimcu.com/forum.php?mod=viewthread&tid=3899&extra=page%3D1

国学芯用 发表于 2023-8-25 10:51:01


STC-ISP V6.92A版 串口助手功能介绍,高级应用;
STC-ISP V6.92A版 串口绘图功能介绍;
STC8G-8H库函数 | 串口库函数 功能介绍;
https://www.stcaimcu.com/forum.php?mod=viewthread&tid=3971&page=1&extra=#pid26425
页: [1]
查看完整版本: STC32G USB CDC如何主动发数据