各位大侠,我写了一个linux下我写了个程序验证串口接收数据情况,是个死循环read,发现串口需要分多次read

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了各位大侠,我写了一个linux下我写了个程序验证串口接收数据情况,是个死循环read,发现串口需要分多次read相关的知识,希望对你有一定的参考价值。

每次只能read四个字节,连续循环多次直到数据read完后,就阻塞了

参考技术A 首先,默认的串口文件的缓存方式是无缓冲。其次,串口在发送数据的时候不是连续的。
比如,串口要给你0x62,0x77。那么他就先发0x62后发0x77。而如果你在他发完0x62的时候马上就read()那就会只得到0x62.而0x77要再read一次。

如果你想一次就全读上来,那有两个方法。
1:你自己写一个读串口的函数,里面调用read;
例如:
int tipc_read_socket( int sockfd, char *buf, int len )

int count = 0; //每次读取字节数
int pos = 0; //总共读取字节数

pos = 0;
do
count = read(sockfd, &buf[pos], len - pos);
//printf("tipc_read_socket:count[%d]\n", count);
if( 0 > count )

if( EINTR == errno )
continue;
//当设置为non block的时候,第一次把所有的数据读取完以后,第二次的结果为-1.
return( pos );


if( 0 == count ) break; /* Nothing left! */
pos += count;
while( len > pos );
return( pos );

2:你设置一下输入输出属性。
struct termios newtio;
bzero( &newtio, sizeof( newtio ) );
newtio.c_cc[VTIME] = ***;
newtio.c_cc[VMIN] = ***;
tcsetattr(fd,TCSANOW,&newtio);
这个里面的VTIME,VMIN。就是读等待的时间。
设置了以后,比如你读0x62的时候read,那么他会等待你设置的时间,如果在这个时间里面0x77来了,那他会把0x62和0x77一起返回给你。这个时间跟波特率有关,应该是设置为在某种波特率的情况下连续两字节的最大间隔时间。追问

我写了程序,发现是波特率的问题115200的时候是好的,可变成9600的时候就分多次读取,怎么办呢,我的模块初始设置就是9600的

参考技术B 将串口打开模式设为非阻塞模式,用多线程实现. 参考技术C 你read给的参数是什么?追问

8N1,默认阻塞方式,非阻塞我也试过,我让它循环读取,结果数据反而读不到了,每次读四个字节,直到循环把所有字节读完为止,我想问下是不是驱动的问题,我设置最小读取字节数是1
newtio.c_cc[VTIME] = 0; //等待时间,单位百毫秒
newtio.c_cc[VMIN] = 1; //等待最小字节数(针对读),不过我也改过这两个值,只是稍微有变化,读取可能会变成5个字节或别的,还是一次读不完,而且我也不知道怎么控制这个参数

本回答被提问者采纳

我写了个项目,帮你学习HTTP接口测试!

端午节我写了一个项目,帮助你学习HTTP接口测试。

GitHub地址:

https://github.com/defnngj/learning-API-test

整个项目基于Flask和 Requests实现。

Flask是Python主流的Web框架,以简单著称,它可非常方便的实现API,整个项目中的API都通过一个文件实现。
Requests是模拟HTTP的测试库,同样是Python语言的明星库,它可以以非常简单的方式模拟HTTP请求。

如何开始学习

克隆或下载项目,安装依赖。

$ pip install -r requirements.txt

启动Flask项目。

$ python api_server.py
 
* Serving Flask app "api_server.py" (lazy loading)
 * Environment:production
   WARNING: Do not use thedevelopment server in a production environment.
   Use a production WSGI serverinstead.
 * Debug mode: on
 * Running onhttp://127.0.0.1:5000/ (Press CTRL+C to quit)
 * Restarting withstat
 * Debugger isactive!
 * Debugger PIN:208-740-173

接下来,你可根据项目文档中所提供的Requests例子,调用启动的服务所提供的接口。

最简单的接口调用。

import requests
 
r = requests.get("http://127.0.0.1:5000/")
result = r.json()
print(result)

接口的返回结果。

"code": 10200, "message": "Welcome toAPI testing"

如果,你想知道上面调用的接口是如何实现的,可以查看api_server.py文件。

# 最简单的json格式返回
@app.route('/')
def hello_world():
    return jsonify(
        "code": 10200, 
        "message": "Welcome to API testing"
    )

Flask 实现接口是不是很简单?当然,还有更多复杂的接口实现,不过,这里的所有接口实现忽略了数据库的操作。

如果想做接口自动化测试,请参考tests/目录,里面提供了基于unittest 单元测试框架的用例。

如果本项目对你帮助,请帮忙加 star,有什么问题也可以通过issues提问。

以上是关于各位大侠,我写了一个linux下我写了个程序验证串口接收数据情况,是个死循环read,发现串口需要分多次read的主要内容,如果未能解决你的问题,请参考以下文章

我写了个项目,帮你学习HTTP接口测试!

我写了个下载程序,用Java写的,但是写完以后发现下载大文件的时候报错,内存溢出,能看看是哪的问题么?

我写了一个C语言程序。但输出结果为一串乱码。不知道是哪里错误了

oracle 并行查询为啥只有一个进程在读。 我写了一个查询语句在里面些了个 /*+ parallel .....*/

为了甩锅,我写了个牛逼的日志切面!

为了甩锅,我写了个牛逼的日志切面!