usb连续向上位机发送数据 出错

usb连续向上位机发送数据 出错,第1张

因为USB通信都是由主机发起的,如果主机没有请求数据,STM32就会出错,也不会出错。BUSHound抓到数据只能说明总线有数据,但是HOST要根据报告描述符来处理这些数据,因此,如果报告描述符对实际的数据描述有误就可能导致HOST处理数据异常。

在while(1);前面加一句 TI=1; 就可以了自己发送了。

不过这样的中断服务程序千万别拿去面试,很多人技术领导一看到写的代码中断服务程序中有delay()一类的东西就直接毙掉。

       嵌入式产品开发经常会用到串口等接口进行上位机和下位机之间的数据传输,那上位机和下位机是如何通过串口进行浮点数传输的呢?我们知道串口有ASCII码(即可见字符形式)和二进制数据格式两种传输方式,是以字节为单位进行数据传输的,这就需要先将浮点数(四个字节)转换为一个一个的字节数再利用串口传输。现将其转换方法总结如下: 

    1、联合体的方式实现

    union { uint8_t a[4];float b; } c

    其中a[0]是b的最高字节。只需将待传输的浮点数直接赋值为b,利用串口传输时利用a[4]数组进行传输即可。

    2、扩大移位的方式实现

    比如需要通过串口将8035这个浮点数进行传输,首先先将其扩大1000倍(其目的是为了保留数据的准确性)后赋值给a,a = 80350(其十六进制为0X0139DE)。然后:(a>>24)&(0X0011) = 00(最高位字节);(a>>16)&(0X0011) = 01(次高位字节);(a>>8)&(0X0011) = 39;a&(0X0011) = DE(最低位字节);最后将其值分别赋值给一个数组,利用串口传输出去。

    3、整数求余的方式实现

    比如a = 54321,a%10 = 1;a/10%10 = 2;a/100%10 = 3;a/1000%10 = 4;a/10000 = 5;然后将其值赋值给一个数组,利用串口发送出去。

    4、指针的方式实现

    float a,unsigned char b;a = 80350;char pchar = (char)&a;for(i = 0; i < sizeof(float);i++){b = pchar;pchar++;b++;},然后只需通过串口将b指针指向的内容传输出去即可。

    以上四种方法建议使用联合体和指针的方法,因为其他两种方法牵涉到浮点数小数点后保留几位小数的问题,这和放大倍数有关,数据接收方还需要进行数据重新组合和处理比较麻烦。

51单片机,数据在发送后,上位机没有接收到数据。
而且,串口中断也没进去,弄了很久不知道是什么问题!
----
既然没有收到,也没有进入串口中断,
那么,你怎么就知道,数据发送出去了?
既然,你确信是发出去了,应该就是上位机的问题,
那么,你换一个上位机,再试试看。

PC连接了设备,获取(采集)设备的状态(数字量、模拟量),则表示该PC及上有设备通讯、采集、管理的软件平台。
当该PC机需要给DCS传输数据,实际是需要改PC机上的软件平台和DCS建立通讯,通讯方式一般采用MODBUS、OPC

数据丢失多半是因为中断造成的,当串口通讯时,系统被其他中断占用了,那么就会出现数据丢失的情况,所以为了保险,可以采取以下措施:
1、将串口中断优先级设为最高。
2、增加反馈信号,DTR和DSR两个信号可以用起来。


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/yw/12596072.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2025-08-26
下一篇2025-08-26

发表评论

登录后才能评论

评论列表(0条)

    保存