当前位置: 技术问答>linux和unix
串口接收丢失数据的问题
来源: 互联网 发布时间:2016-03-17
本文导语: 运行在arm-linux上的录像程序,同时要接收响应上位机的命令。 从视频流得到的视频数据放置在内存中的视频文件中,一个文件结束后拷贝到sd卡上。 但是这样做就引起串口接收的问题,当接收一条70多个字节长度...
运行在arm-linux上的录像程序,同时要接收响应上位机的命令。
从视频流得到的视频数据放置在内存中的视频文件中,一个文件结束后拷贝到sd卡上。
但是这样做就引起串口接收的问题,当接收一条70多个字节长度的上位机命令时,接收数据经常会丢几个字节,接收正确的概率大约是90%,后来经过问题排查,发现当注释掉从内存向sd卡拷贝数据的那条语句后就没有问题了。
拷贝语句是:system("cp .....")
怀疑问题是由于当向sd卡拷贝文件的时候,会引起DMA中断,由于视频文件较大,经测试拷贝时间需要2秒左右,所以在此期间上位机发送的串口数据得不到中断响应引起的。
请指点一下我得判断是不是正确?问题应该怎么解决?
从视频流得到的视频数据放置在内存中的视频文件中,一个文件结束后拷贝到sd卡上。
但是这样做就引起串口接收的问题,当接收一条70多个字节长度的上位机命令时,接收数据经常会丢几个字节,接收正确的概率大约是90%,后来经过问题排查,发现当注释掉从内存向sd卡拷贝数据的那条语句后就没有问题了。
拷贝语句是:system("cp .....")
怀疑问题是由于当向sd卡拷贝文件的时候,会引起DMA中断,由于视频文件较大,经测试拷贝时间需要2秒左右,所以在此期间上位机发送的串口数据得不到中断响应引起的。
请指点一下我得判断是不是正确?问题应该怎么解决?
|
当接收一条70多个字节长度的上位机命令时,接收数据经常会丢几个字节,接收正确的概率大约是90%,后来经过问题排查,发现当注释掉从内存向sd卡拷贝数据的那条语句后就没有问题了。
你说的丢是指的没有接收到还是接收错误?
------------------------------------
windows中,中断是分优先级的,由中断控制器控制,操作系统管理。但是linux好像并不要求硬件中断分优先级,而是将中断管理分为快速中断处理程序和慢速处理程序两部分处理的,慢速处理程序由cpu调度程序调度管理,快速中断处理部分遵循先来先处理的原则处理。具体不太清楚,以前看过记得一点。
应该不是这个原因。如故还怀疑,那就自己测试一下就是了,使用串口和arm机通讯,通过控制台往sd卡上拷贝数据,看串口通讯是否出错。
简单的作法就是让上位机重发指令.
还有就是自己写拷贝函数,在拷贝过程中加usleep,让出一不分时间来.
你说的丢是指的没有接收到还是接收错误?
------------------------------------
windows中,中断是分优先级的,由中断控制器控制,操作系统管理。但是linux好像并不要求硬件中断分优先级,而是将中断管理分为快速中断处理程序和慢速处理程序两部分处理的,慢速处理程序由cpu调度程序调度管理,快速中断处理部分遵循先来先处理的原则处理。具体不太清楚,以前看过记得一点。
应该不是这个原因。如故还怀疑,那就自己测试一下就是了,使用串口和arm机通讯,通过控制台往sd卡上拷贝数据,看串口通讯是否出错。
简单的作法就是让上位机重发指令.
还有就是自己写拷贝函数,在拷贝过程中加usleep,让出一不分时间来.
|
1.不明白为什么向sd卡拷贝的时候一定要 system调用cp命令的。
2.串口接收数据的缓冲区是有限制的,要立即响应,看看你的串口进程是不是分配不到cpu,导致没有及时处理。
2.串口接收数据的缓冲区是有限制的,要立即响应,看看你的串口进程是不是分配不到cpu,导致没有及时处理。
|
所以要把整个拷贝动作分段进行。
每拷贝一点就检查下,是否在接收指令,不是在进行中的话,就继续下一阶段拷贝动作。
每拷贝一点就检查下,是否在接收指令,不是在进行中的话,就继续下一阶段拷贝动作。
|
1、使用 nice 系统命令 或者 nice函数调用,将串口处理的进程优先级提高到-20,对性能有一定影响。
2、有必要的话,检测一下程序中关于串口设置的参数,详情参见:http://blog.csdn.net/qdhuxp/archive/2006/08/09/1041669.aspx
2、有必要的话,检测一下程序中关于串口设置的参数,详情参见:http://blog.csdn.net/qdhuxp/archive/2006/08/09/1041669.aspx