关于嵌入式linux下的串口通讯问题---回车、换行、缓冲
经过实验,从Linux(PC)通过串口向嵌入式Linux开发板发送数据时,串口初始化完毕后遇到回车(0x0d)或换行(0x0a)才开始从串口接收数据,回车或换行前的数据接收不到,回车或换行后的数据接收正常.从嵌入式Linux开发板通过串口向Linux(PC)发送数据,接收正常.无丢字符现象.请问这是为什么?两台Linux(PC)经过串口通讯接收正常.
------------------------------------
接受程序是这样的:(之前的初始化就不写了,肯定没问题)
char buff[512];
while((nread = read(fd,buff,10))>0)//fd是端口文件
{
printf("Len %d\n",nread);
buff[nread]='\0';
printf("%s\n",buff);
}
我把两台机器串口连起来,一台linux运行这个程序。另一台winxp运行串口助手先前者发数据。比如发
两次“This is a test message!”这个字符串,[b]发现linux端没有任何显示[/b]。这时,我在winxp的字符串后加一个回车符再发一次,linux就接受到了,而且之前发的数据也打印数来了,如下
len=10
This is a
len=10
test messa
len=10
ge!This is
len=10
a test me
len=10
ssage!This
len=10
is a test
len=10
message!
len=1
(最后这应该是回车符)
我的理解是串口发的数据linux已经都受到了,都放在缓冲区里了,但是必须出现一个结束符read函数才能从缓冲区里读出数据来,所以最后加上回车符发送消息后,之前发的也显示出来了,不知道这么理解对不对。
但是,我现在是想只要winxp端发来数据,linux端就显示出来,而不必等待结束符。我想了好久也没有头绪,对缓冲区这里得知识不太了解。希望各位高手帮帮忙,要怎样解决这个问题?
是用setbuf吗?
setbuf(stdin,NULL);
我用这个不管用
http://astronomy.swin.edu.au/~pbourke/other/serial/tru64.c
还有个编程向导也可以看看
http://digilander.libero.it/robang/rubrica/serial.htm
他给我发送数据的时候现在我必须让他在数据的末尾再另加发一个回车的ASIC码我才能收到,否则收不到,这是怎么回事情啊?
想想也不对呀,怎么会让对方加结束符你才能收到,你是怎么判断一帧数据结束的?查检一下
{
nread = read(fd, buff, 127);
while((nread>0))
{
buff[nread]='\0';
printf("%s",buff);
nread = 0;
}
}
}
这个是我的读串口程序,我没加任何判断,只要读到了就显示.可如果对方不发送回车我这边就怎么也显示不出来.无论对方之前发了多少东西,只要最后发个回车,前面发的就会全部显示出来.
options.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG);
options.c_oflag &= ~OPOST;
options.c_oflag &= ~OPOST;
接受程序设置了,还是那样.
应该不是发送方的问题.因为我用另外一个linux系统发送也是这样,发送完了必须发送个回车.
这边才接到.
#include <stdio.h> /* Standard input/output definitions */
#include <string.h> /* String function definitions */
#include <unistd.h> /* UNIX standard function definitions */
#include <fcntl.h> /* File control definitions */
#include <errno.h> /* Error number definitions */
#include <termios.h> /* POSIX terminal control definitions */
#include <signal.h>
#include <sys/types.h>
#include <sys/time.h>
#include <sys/select.h>
int main(void)
{
int recnum,fd;
char buf[1024];
recnum=0;
recnumb=0;
fd=open("/dev/ttyS0",O_RDWR|O_NONBLOCK)
if(fd==-1)
{
perror("failed to open com1:");
return 0;
}
ia=write(fd,"the data come from linux!",25);
if(ia <0)
{
fputs("failed to write data to com1!\n",stderr);
return 0;
}
while(1)
{
recnum=read(fd,buf,255);
if(recnum>0)
break;
}
printf("%s\n",buf);
close(fd);
return 0;
}
--------------------------
要进行终端特性设置的,好好看看termio
9.1设置规范模式
规范模式是面向行的输入方式,输入字符被放入用于和用户交互可以编辑的缓冲区内,直接到读入回车或者换行符号时才结束。
可以通过如下方式来设置
option.c_lflag |= (ICANON | ECHO | ECHOE);
9.2设置原始输入模式
原始输入模式是没有处理过的,当接收数据时,输入的字符在它们被接收后立即被传送,使用原始输入模式时候,一般可以选择取消ICANON,ECHO,ECHOE和ISIG选项。
例如:
option.c_lflag &= ~(ICANON | ECHO | ECHOE);
=========================================================================
总结:上面的问题应该比较清楚了,就是在输入模式的设置上出了问题,默认的可能是行缓冲的,导致在接收串口的时候,串口会自行把数据存到缓冲里面,只有接收到回车、换行等结束标志后,才把数据一起送到内存,这样串口的read函数才能读到数据,也就会触发相应的标志(SIGIO)。所以,需要在对串口设置的时候,要设置为原始输入模式。
关于嵌入式linux下的串口通讯问题---回车、换行、缓冲相关推荐
- linux 串口 换行十六制,关于嵌入式linux下的串口通讯问题---需增加回车/换行才能接收...
问题:在Linux应用层,直接从/dev/tty***使用read()函数读数据,无法读到,只有在数据末尾加上0a/0d才可以读到数据(这里是发送十六进制的数据,ASCLL码同理,增加回车才可以读到数 ...
- linux下实现串口通讯
1.关键结构体 (1)struct termios { unsigned short c_iflag; /* 输入模式标志*/ ...
- C——Linux下的串口编程
原 C--Linux下的串口编程 2017年06月06日 19:30:50 C_Aya 阅读数:11537 <span class="tags-box artic-tag-box&qu ...
- gsm基于linux程序,基于嵌入式Linux下GSM模块的短信收发系统设计
摘要:移动通信中的短消息业务以其方便.可靠和价廉得到了广泛应用,本文在嵌入式Linux系统中,通过西门子MC35模块,实现了短信收发系统,该系统采用PDU短信模式,能支持中文短信.程序设计采用异步事件 ...
- linux 测试串口命令,Linux 下测试串口的命令microcom
昨天应为要测试主板上的串口,查了一下,可以使用microcom 这条命令进行测试. 命令使用方法很简单: Usage: microcom [-d DELAY] [-t TIMEOUT] [-s SPE ...
- STM32串口通信代码、ASCII码、XU4串口通信,printf只会转换为无符号类型,linux下的串口通信程序
1.其里面的的通信协议是是自己定的,这里 是检测到数据的结尾是以0x0d.0x0a结尾,则表示接受的数据完成了,这个数据是我想要的,这样子就不会出现一些错乱的数据信息.其中的0x8000.0x4000 ...
- 嵌入式linux与pc串口传输文件基于lrzsz
嵌入式linux与pc串口传输文件基于lrzsz 嵌入式linux传输应用程序通常用nfs.tftp等比较麻烦,一般小应用也就几k用串口就行,这里给出一种串口传输文件的方式lrzsz lzsz需要在开 ...
- 嵌入式linux学习笔记--TCP通讯整理
嵌入式linux学习笔记–TCP通讯整理 之前的项目中使用到了比较多的tcp 通讯相关的知识,一直也没有进行整理,今天准备拿出时间好好的整理一下TCP通讯的整个过程.预计会整理linux和window ...
- 嵌入式linux进行视频监控,嵌入式Linux下的视频监控解决方案
原标题:嵌入式Linux下的视频监控解决方案 在嵌入式工控板上接一个摄像头进行视频监控,看起来比较容易实现,但往往是"理想很丰满.现实很骨感".历经千辛万苦效果却不是很理想,本文就 ...
最新文章
- iOS中UIDynamic物理仿真详解
- 微软研究院开源DialoGPT:你有什么梦想?「让世界充满机器人」
- VIP群第一期讲座实屏片段摘录
- python精彩编程200例百度_Python趣味编程与精彩实例
- 数据结构:线性数据结构(2)-队列(栈,队列,deques, 列表)
- Mac OS使用技巧十九:Safari碉堡功能之二查看网页源码
- hdu5461-Largest Point(贪心)
- springMVC接收数组参数
- 判别式模型和生成式模型的区别(discriminative model and generative model)
- HTTP和HTTPS有什么区别? 什么是SSL证书?使用ssl证书优势?
- 机器学习、神经网络、深度学习区别
- 如何使用计算机内设照相机,win7系统打开照相机功能的操作方法
- 【论文笔记】Neural Relation Extraction with Multi-lingual Attention
- java 农历_java怎么取得农历的节日
- APS高级排程在钣金冲压行业的应用
- 中止执行后超过2年_执行中止。债权人是否两年内都要申请执行一次。如果中止执行两年内不申请执行,是否都再也执行不了...
- RBP系统管理之日志管理
- 【Python】PyQt5.QtWidgets模块常用函数和类(使用参考源码)
- 华为云服务-运维篇-弹性负载均衡
- Android 按关键字或文件后缀搜索文件
热门文章
- 正态分布(用python画出相应的图)
- 怎么将EXCEL转换为财务软件导入需要的XML格式,干货到,EXCEL如何转换为财务软件导入数据所需格式
- 开发和常用工具推荐清单
- 每周一品 · 直线电机(Linear Motor)中的磁性材料
- SQL Server Arithmetic overflow error converting nvarchar to data type numeric
- 网站php挂马从哪里挂的,寻找PHP(网站)挂马,后门
- 菜鸟好文推荐(九)——程序员”青春饭”问题之我见
- Android开发:开源库集合
- DP(最长上升子序列)——腾讯校招题:逛街
- 小x与三角形 c语言 1秒,[2019年第一水] 小x与神牛