天嵌 ARM开发社区

 找回密码
 注册
查看: 4340|回复: 6

TQ2440串口测试程序咨询

[复制链接]
Smartfatlv 发表于 2014-5-3 22:47:19 | 显示全部楼层 |阅读模式
本帖最后由 Smartfatlv 于 2014-5-15 16:40 编辑

实验过程:
(1)UART0做控制台接pc1的串口,扩展板扩展出的UART1接pc2串口
(2)pc1,pc2分别运行串口调试助手,使用pc1控制台运行serial_test程序,pc2上的串口调试助手收到“hello,TQ2440”测试信息。
(3)利用pc2上的串口调试助手给UART1发送一组ASSII码(0x01~0x0f),这组assii码写在一个文件里,pc1上的串口收到如下信息
recv:8
0x01,0x0

recv:56
2,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d

recv:12
,0x0e,0x0f

问题:为什么这组数据会断开显示,数据缓冲区buf不是定义的512吗,为什么不一次性read出来?或者怎样让它一次性read出来!!谢谢指教。
主要代码如下:
if((nread = read(serial_fd,buff,512))>0)
  {
   buff[nread] = '\0';
   printf("\nrecv:%d\n",nread);
   printf("%s",buff);
   printf("\n");
  }
}
TQ-ZQL 发表于 2014-5-4 09:02:40 | 显示全部楼层
重新设置一睛串口的超时时间看下。
 楼主| Smartfatlv 发表于 2014-5-4 13:22:41 | 显示全部楼层
TQ-ZQL 发表于 2014-5-4 09:02
重新设置一睛串口的超时时间看下。

我在printf("nread=%d,%s\n",nread,buff);之前加了一个延时。发现打印时还是分多次打印。
也就是说使用read函数读的时候就没有一次性读完。请问尊敬的天嵌工程师,那个read函数是如何判断串口这个文件的数据已经读结束的?是不是有个时间控制,数据间隔一定时间就认为读完了?
TQ-ZQL 发表于 2014-5-4 13:30:33 | 显示全部楼层
不是加延时,建议先看下串口编程的相关文档。
 楼主| Smartfatlv 发表于 2014-5-4 16:55:13 | 显示全部楼层
linux串口编程 非规范模式 read()问题
http://blog.chinaunix.net/uid-14704264-id-3189936.html
在linux下编写终端程序时,有规范模式 ,非规范模式(原始模式特殊的非规范模式)之分。不用于终端,而是在串口这种使用情况下,一般设置为原始模式(非规范的一种特殊情况)。但用read()函数,希望从串口接收指定的数量的字符时,往往接收到的实际字符数,都与指定的不同。如本人用read()希望接收 10 bytes的数据,但实验后发现,分了几次才接收到,俩次接收2bytes ,两次接收3bytes。

查阅相关资料得知:

一般地串口的读写模式有直接模式和缓存模式,在直接模式下,串口的读写都是单字节的,也就是说一次的read或write只能操作一个字节;

但是大部份串口芯片都支持缓存模式,缓存模式一般同时支持中断聚合和超时机制,也就是说在有数据时,当缓存满或者超时时间到时,都会触发读或写中断。写的时候可以将要操作的数据先搬到缓存里,然后启动写操作,芯片会自动将一连串的数据写出,在读的时候类似,一次读到的是串口芯片缓存里的数据。串口设备的缓存一般有限,一次能read到的最大字节数就是缓存的容量。所以串口芯片的缓存容量决定了你一次能收到的字节数。本人用一个usb转232来充当串口接收时,发现一次可以接收8个bytes。


对于具体一次传输多少字节也不去追究了,总之通讯过程中无法保证一次发送的数据肯定是一次接收的,所以必须写代码 来一次一次的接收,直到接收满足预定的为止,当然在此过程中得使用select/poll来避免超时接收。

即从通讯的角度来说,接受方必须自己解决如何识别一个祯的问题。
(操作串口相当于操作物理层,OSI/ISO模型中的第一层,解决祯同步问题是第二层的任务,所以我们需要自己搭一个第二层。
也就是说:我们需要通过定义通讯协议,规定数据的内容自己分析什么时候收完了一次需要的数据。因为通讯过程中无法保证一次发送的数据肯定是一次接收的)
一撇一捺 发表于 2014-5-4 22:54:49 | 显示全部楼层
readAll()
 楼主| Smartfatlv 发表于 2014-5-15 16:39:49 | 显示全部楼层
修改一下termio结构中的 c_cc[]的超时参数VTIME和控制字符VMIN的大小就可以了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

i.MX8系列ARM cortex A53 M4 工控板上一条 /1 下一条

Archiver|手机版|小黑屋|天嵌 嵌入式开发社区 ( 粤ICP备11094220号 )

GMT+8, 2024-5-23 17:49 , Processed in 1.046875 second(s), 18 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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