迪文科技论坛

 找回密码
 立即注册
搜索
查看: 3966|回复: 16

OS程序中串口接收数据是轮询的,这样高速接收很容易丢把?

[复制链接]

9

主题

18

回帖

114

积分

注册会员

Rank: 2

积分
114
发表于 2019-8-15 22:07:31 | 显示全部楼层 |阅读模式
     用UART4开发OS程序,实现用自定义的通信协议与屏幕交互。
     OS程序中是轮询接收串口数据的,这就有一个问题,当os程序正处理循环中的其他代码时,单片机或串口助手向屏幕发送数据,就有可能出现这帧数据接收不到的情况,
这样通信就不可靠了。。。
    针对这个问题我的想法是:发送方两帧数据之间要间隔足够长的时间,使os程序在这个时间间隔内肯定能够处理完成其他代码,处理完后其他代码条件为假,下次循环在其他代码的执行上不费时间,因此循环中主要是接收数据,这样才可能不会丢数据,但是还是感觉不太可靠。。。
    而且在os程序中再加功能时,这个时间还要重新测定才可以。。
    单片机周期向屏幕发采集的数据,每次修改os程序这个周期要测,,而且时间可能还会很长。。
    所以这个问题要怎么处理比较好呢??保证屏幕接收数据不会丢。
回复

使用道具 举报

0

主题

239

回帖

1832

积分

金牌会员

Rank: 6Rank: 6

积分
1832
发表于 2019-8-16 09:33:08 | 显示全部楼层
本帖最后由 qjhzh 于 2019-8-16 09:40 编辑

T5的os吧 不要在主程序里加延时就行了,其实和单片机的串口处理写法是一回事的。
另外楼主其实不用担心这个问题。串口接收数据是存在缓存里的。
T5的串口有253字节的接收FIFO,只要2次轮询之间,串口发送的数据总数不超过253,数据就会都缓存在FIFO里建议轮循时读取下串口接收超时溢出状态为0,然后再读取数据长度和数据
回复

使用道具 举报

9

主题

18

回帖

114

积分

注册会员

Rank: 2

积分
114
 楼主| 发表于 2019-8-16 14:17:35 | 显示全部楼层
qjhzh 发表于 2019-8-16 09:33
T5的os吧 不要在主程序里加延时就行了,其实和单片机的串口处理写法是一回事的。
另外楼主其实不用担心这个 ...

    嗯嗯,调试时我也发现了,串口接收的数据是存在缓存里的。
    我还发现接收到下一帧数据而上一帧数据并没有读取的话,这帧数据就被覆盖了,不是接着上一帧数据往后存储的。
    也就是说单片机发完一帧数据,要给OS足够的时间处理完其他的代码,然后可以跳到轮询读取处把这帧数据读出来,再发下一帧数据。这样OS就不会存在丢帧的情况。应该是这样的把??
回复

使用道具 举报

0

主题

239

回帖

1832

积分

金牌会员

Rank: 6Rank: 6

积分
1832
发表于 2019-8-16 14:35:28 | 显示全部楼层
T5的OS不用加延时的,处理速度很快。楼主测试有丢帧的情况吗?
回复

使用道具 举报

9

主题

18

回帖

114

积分

注册会员

Rank: 2

积分
114
 楼主| 发表于 2019-8-16 14:55:54 | 显示全部楼层
qjhzh 发表于 2019-8-16 14:35
T5的OS不用加延时的,处理速度很快。楼主测试有丢帧的情况吗?

    隔30ms就不会丢,时间再短些就会丢。
    OS程序实现的就是:收到固定格式的数据帧,判断下再回复应答。
    我的测试方法是:用串口助手隔多少时间定时发送,发现时间短就会有几帧数据没应答。
回复

使用道具 举报

0

主题

239

回帖

1832

积分

金牌会员

Rank: 6Rank: 6

积分
1832
发表于 2019-8-16 16:24:30 | 显示全部楼层
您意思30ms以内会丢数据,应该是您串口处理有问题的。
DWIN OS平台下1mS可以执行1万条指令,您看看代码处理是否在20多mS以内都没处理串口? 可以把您写的OS发上来来参考一下的。
回复

使用道具 举报

9

主题

18

回帖

114

积分

注册会员

Rank: 2

积分
114
 楼主| 发表于 2019-8-16 16:32:26 | 显示全部楼层
qjhzh 发表于 2019-8-16 16:24
您意思30ms以内会丢数据,应该是您串口处理有问题的。
DWIN OS平台下1mS可以执行1万条指令,您看看代码处理 ...
  1. ;UART4串口接收82 83 指令并进行处理
  2.   ORG 1000H
  3.   GOTO   MAIN
  4.   NOP
  5.   NOP
  6.   NOP
  7.   ORG  1080H
  8. MAIN:   
  9.             CALL      INITE
  10.             CALL      READ_82
  11.             CALL      SEND_82
  12.             CALL      SEND_83
  13.             GOTO      MAIN
  14.             
  15. ;*************************************
  16. ;          系统初始化
  17. ;*************************************
  18. INITE:      IJNE      R255,0,INIRET
  19.             LDBR      R255,1,1
  20.             COMSET    40H,136;      //设置串口4,波特率115200,上电执行一次
  21.             
  22. INIRET:     NOP
  23.             RET
  24. ;****************************************
  25. ;          接收82指令
  26. ;******************************************
  27. READ_82:  
  28. LDBR R12,2,1
  29.             ;COMTXD     4,R10,R12     
  30.             RDXLEN     4,R17
  31.             IJNE       R17,0,RD1;        //检查返回串口的数据长度
  32.             RET
  33.             
  34. RD1:        MOVDR      17,R10,1
  35.             IJNE       R10,0,RET82;       //R10检查是否溢出
  36.             RDXDAT     4,R40,R17;        //长度在R17里面,数据在R40里面
  37.             IJNE       R40,0X5A,RET82;   //比较帧头
  38.             IJNE       R41,0XA5,RET82
  39.             IJNE       R43,0X82,READ_83;  //判定是82指令还是83指令
  40.             DEC        R17,0,6
  41.             MOV        R17,R9,1
  42.             MOV        R46,R200,0;        //需要交换的数据放入R200里
  43.             
  44.             LDBR       R10,0,7
  45.             LDBR       R20,0,7
  46.             LDBR       R27,2,1
  47.             DIV        R10,R20,0
  48.             MOV        R17,R9,1;           //需要写入的字长度在R9里

  49.             LDBR       R254,1,1;           //启动SEND_82处理82指令
  50.             
  51. RET82:      RET
  52. ;******************************************
  53. ;           接收83指令
  54. ;*****************************************
  55. READ_83:    IJNE       R43,0X83,RET83;       //R46字长度
  56.             MOV        R44,R0,2
  57.             MOV        R46,R9,1
  58.             MOVXR      R157,1,0;          //数据读到R157
  59.             MOV        R43,R153,4
  60.             
  61.             LDBR       R10,0,18
  62.             LDBR       R18,2,1
  63.             LDBR       R27,4,1
  64.             MOV        R46,R13,1
  65.             MAC        R10,R15,R20;       //计算返回指令中83后的字节数
  66.             MOV        R27,R152,1
  67.             INC        R27,0,3;           //需要返回串口的字节长
  68.             LDBR       R253,1,1;           //启动SEND_83处理83指令

  69. RET83:      NOP
  70.             RET
  71. ;***************************************
  72. ;          处理82指令
  73. ;******************************************
  74. SEND_82:     IJNE      R254,1,SD82
  75.              LDBR      R254,0,1
  76.              MOV       R44,R0,2
  77.              MOVXR     R200,0,0;            //写入变量地址

  78. SD82:        NOP
  79.              RET
  80. ;******************************************
  81. ;          处理83指令
  82. ;********************************************
  83. SEND_83:     IJNE      R253,1,SD83
  84.              LDBR      R253,0,1
  85.              LDWR      R150,5AA5H
  86.              COMTXD    4,R150,R27;          //通过串口返回83指令
  87.             
  88. SD83:        NOP
  89.              RET
复制代码
回复

使用道具 举报

9

主题

18

回帖

114

积分

注册会员

Rank: 2

积分
114
 楼主| 发表于 2019-8-16 16:38:24 | 显示全部楼层
qjhzh 发表于 2019-8-16 16:24
您意思30ms以内会丢数据,应该是您串口处理有问题的。
DWIN OS平台下1mS可以执行1万条指令,您看看代码处理 ...

    用迪文提供的例子代码就可以测出来,定时发送一段时间后取消定时发送,lcd回复的应答数据会少几帧的,
那不就说明串口助手发的数据他没收到没处理嘛,应该是收到了没时间处理,立马被下一帧数据覆盖了。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0

主题

239

回帖

1832

积分

金牌会员

Rank: 6Rank: 6

积分
1832
发表于 2019-8-16 16:44:13 | 显示全部楼层
这个是迪文写的一个串口4使用82,83指令的os文件。这个应该不会有问题。我用串口助手测试,定时15ms发送读取屏幕版本号,一直都是正常的。不知道楼主是怎么测试的
回复

使用道具 举报

0

主题

239

回帖

1832

积分

金牌会员

Rank: 6Rank: 6

积分
1832
发表于 2019-8-16 16:50:29 | 显示全部楼层

我测试定时15ms发送一直没有丢数据的情况发生。楼主其实不用纠结这个问题的。可以放心使用,应该考虑其他的开发测试项目了。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|迪文科技论坛 ( 京ICP备05033781号-1 )

GMT+8, 2026-4-15 02:50 , Processed in 0.055598 second(s), 22 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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