发 帖  
原厂入驻New
申请华秋企业认证 多层板首单免费打样!
30s提交资料,10分钟通过审核(免费赔付+顺丰包邮)>>立即报名
[问答] 串口通信部分
509 串口
分享
功能
1、实现不同按钮按下可以发送不同的指令
2、当有数据时可以及时处理,一组数据是4096个,会持续发送很多组,要对这些数据进行16进制的处理和保存

目前程序碰到问题
1、程序按钮响应一开始可以及时响应,当程序运行一次后,无法及时发送数据,响应慢
2、程序的停止按键,按下需十几秒才能停止

想问问怎么优化这个程序
0
c97b8f959557121950bb84f44141f40.png
b5a0d98545e1c54c84df4509938b9af.png
7353f9e391335e2b3c0470bd0981fcf.png
700c88a0350d108a39d588285b67f6c.png
已退回10积分
2019-12-6 17:17:13   1 评论 分享淘帖 邀请回答
1 条评论
8个回答
本帖最后由 RedJ 于 2019-12-6 19:58 编辑

要不在写入前使用VISA清空I/O缓冲区清除一下试试,关闭慢可能是等待超时了,串口默认超时等待时间为10s。另外的话那个快速VI不知道会不会影响速度,你可以不使用那个VI试试先。
2019-12-6 19:57:33 1 评论

举报

1 条评论
  • 2019-12-9 09:59

    超时我之前按照别人的建议设置了,发现按钮响应变快了,但是我接收的数据不完整了

2019-12-6 20:25:55 1 评论

举报

1 条评论
一次传4096个数据?
你最好看看VISA说明文档
2019-12-6 23:13:00 2 评论

举报

2 条评论
串口的硬件缓冲区不会随软件缓冲区设置的改变而改变,即便你设置9000字节,常规串口硬件缓冲区依然是4096,这种架构和波特率下不是溢出就是无法实施结束。建议:1)采用生产者-消费者模式;2)消费者为双队列模式(第一个队列采集串口硬件缓冲区的所有数据,即有数据就采集;第二个队列将第一个队列中的数据按帧读取并处理)3)判断帧头不需要每个循环都执行,首次循环执行中用一个循环执行即可,找到帧头该循环结束,否则通过延时来结束。你的项目难点在于两点:1)如何在115200波特率下实现数据无损和实时的接收和处理;2)如何在数据无损的条件下结束该通讯程序。
2019-12-9 11:27:00 8 评论

举报

8 条评论
  • 2019-12-9 15:45

    这个是对串口读数据的处理,串口写数据同样用队列进行判断吗

    老蜗牛 回复 2021596042: 2019-12-9 17:02

    一般下位机(比如单片机)都是直接按通讯协议发数据就可以了。

    2021596042 回复 老蜗牛: 2019-12-13 09:50

    你好,我改变串口变成usb读取数据,然后用了生产消费的模式,因为usb我没有找到有数据就读写的属性节点,所以我就每次接收4097个数据作为生产者队列,因为4097个数据后面会有一个帧尾,没有帧头,但是我想问问,第一个消费者队列,我要怎么循环判断,我每次是要获取4096个数据去显示的,帧尾不要

    老蜗牛 回复 2021596042: 2019-12-13 10:06

    两个问题:第一,一帧几个字节?帧头几个字节?帧尾几个字节?第二:发送09命令后,下位机应该是始终发送数据吧?如果这样,生产者循环中需要每次循环都发送命令09吗?

    2021596042 回复 老蜗牛: 2019-12-13 10:23

    一帧有4097个字节,没有帧头,帧尾一个,但是帧尾69,平常的数据也有69,循环搜索不可取,发送09,下位机发数据,每次要发09才会给我数据

    2021596042 回复 老蜗牛: 2019-12-13 10:24

    然后我觉得我可以跳过这个帧头帧尾的判断,直接进行数据处理,忽略掉帧尾

    老蜗牛 回复 2021596042: 2019-12-13 11:38

    1,既然每次发命令才给数据,就不需要生产者消费者模式—普通循环不就可以了,发一个命令,收数,显示,保存;再发一个命令,……。此时波特率不是传输快慢的瓶颈,因为可以用发命令来控制实际传输等效速率。2,用串口助手确认一下一帧4097个字节是否能收到,收全。3,若可以收数,你收4097个字节数,然后截取前4096个字节进行你要的处理不就可以了。

    2021596042 回复 老蜗牛: 2019-12-13 11:51

    因为我改成usb接收数据了,所以变成这样

本帖最后由 2021596042 于 2019-12-13 11:47 编辑

我还有一些其他的指令要对下位机进行命令的发送,所以这个模式还是可以的,现在我又遇到了循环套循环的问题,我一组4096个数据要变2048个16位数据放在第一列,后面后的其他组数据放在第二列,我之前while循环套for,有没有好的方法
5c4cc1864c986ad5da5f4d701c8bc90.png
2019-12-13 09:54:15 1 评论

举报

1 条评论
遇到个问题,我可不可以不要while套for,实现我4096个数据一列一列这样啊
5c4cc1864c986ad5da5f4d701c8bc90.png
2019-12-13 11:51:03 2 评论

举报

2 条评论
这个是我之前做的,由于我在其他的程序上改,那个0是没用的,后面是数据保存我还没改完,只是不让报错可以运行
1576217085(1).jpg
2019-12-13 14:06:20 评论

举报

设计模式选错了,应该使用队列。按钮相应是入队列,在出队列来处理数据
2020-1-1 14:01:47 评论

举报

撰写答案

你正在撰写答案

如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。

高级模式
您需要登录后才可以回帖 登录 | 注册

我要提问
关闭

站长推荐 上一条 /5 下一条

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