当前位置:首页 » 操作系统 » linux读取串口

linux读取串口

发布时间: 2023-05-22 17:49:25

linux怎么读取串口数据

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<termios.h>
#include<errno.h>

#defineFALSE-1
#defineTRUE0

intspeed_arr[]={B38400,B19200,B9600,B4800,B2400,B1200,B300,B38400,B19200,B9600,B4800,B2400,B1200,B300,};
intname_arr[]={38400,19200,9600,4800,2400,1200,300,38400,19200,9600,4800,2400,1200,300,};
voidset_speed(intfd,intspeed){
inti;
intstatus;
structtermiosOpt;
tcgetattr(fd,&Opt);
for(i=0;i<sizeof(speed_arr)/sizeof(int);i++){
if(speed==name_arr[i]){
tcflush(fd,TCIOFLUSH);
cfsetispeed(&Opt,speed_arr[i]);
cfsetospeed(&Opt,speed_arr[i]);
status=tcsetattr(fd,TCSANOW,&Opt);
if(status!=0){
perror("tcsetattrfd1");
return;
}
tcflush(fd,TCIOFLUSH);
}
}
}

intset_Parity(intfd,intdatabits,intstopbits,intparity)
{
structtermiosoptions;
if(tcgetattr(fd,&options)!=0){
perror("SetupSerial1");
return(FALSE);
}
options.c_cflag&=~CSIZE;
switch(databits)
{
case7:
options.c_cflag|=CS7;
break;
case8:
options.c_cflag|=CS8;
break;
default:
fprintf(stderr,"Unsupporteddatasize ");return(FALSE);
}
switch(parity)
{
case'n':
case'N':
options.c_cflag&=~PARENB;/*Clearparityenable*/
options.c_iflag&=~INPCK;/*Enableparitychecking*/
break;
case'o':
case'O':
options.c_cflag|=(PARODD|PARENB);
options.c_iflag|=INPCK;/*Disnableparitychecking*/
break;
case'e':
case'E':
options.c_cflag|=PARENB;/*Enableparity*/
options.c_cflag&=~PARODD;
options.c_iflag|=INPCK;/*Disnableparitychecking*/
break;
case'S':
case's':/*asnoparity*/
options.c_cflag&=~PARENB;
options.c_cflag&=~CSTOPB;break;
default:
fprintf(stderr,"Unsupportedparity ");
return(FALSE);
}

switch(stopbits)
{
case1:
options.c_cflag&=~CSTOPB;
break;
case2:
options.c_cflag|=CSTOPB;
break;
default:
fprintf(stderr,"Unsupportedstopbits ");
return(FALSE);
}
/*Setinputparityoption*/
if(parity!='n')
options.c_iflag|=INPCK;
tcflush(fd,TCIFLUSH);
options.c_cc[VTIME]=150;
options.c_cc[VMIN]=0;/*UpdatetheoptionsanddoitNOW*/
if(tcsetattr(fd,TCSANOW,&options)!=0)
{
perror("SetupSerial3");
return(FALSE);
}
return(TRUE);
}

intmain()
{
printf("Thisprogramupdateslasttimeat%s%s ",__TIME__,__DATE__);
printf("STDIOCOM1 ");
intfd;
fd=open("/dev/ttyS0",O_RDWR);
if(fd==-1)
{
perror("serialporterror ");
}
else
{
printf("open");
printf("%s",ttyname(fd));
printf("succesfully ");
}

set_speed(fd,115200);
if(set_Parity(fd,8,1,'N')==FALSE){
printf("SetParityError ");
exit(0);
}
charbuf[]="fe55aa07bc010203040506073d";
write(fd,&buf,26);
charbuff[512];
intnread;
while(1)
{
if((nread=read(fd,buff,512))>0)
{
printf(" Len:%d ",nread);
buff[nread+1]='';
printf("%s",buff);
}
}
close(fd);
return0;
}

❷ linux怎么用C程读取XBee接收到的串口数据

1、接受数据一般是阻塞,就是没有接收到数据就一直等待,可以设置为不阻塞,这样就可以了

2、另一种方法是,创建线程,一收、一发,就可以互不影响

❸ 请问程序中linux如何获取可用的串口列表

dmesg | grep tty

下面是一个例子,例子中采用的是USB转串口线(pl2303)。

插入线:
$ dmesg|grep tty
[ 0.000000] console [tty0] enabled
[ 1.248404] serial8250: ttyS0 at I/O 0x3f8 (irq = 4) is a 16550A
[ 1.624590] 00:07: ttyS0 at I/O 0x3f8 (irq = 4) is a 16550A
[ 12.618301] usb 5-2: pl2303 converter now attached to ttyUSB0

拔出线:
$ dmesg|grep tty
[ 0.000000] console [tty0] enabled
[ 1.248404] serial8250: ttyS0 at I/O 0x3f8 (irq = 4) is a 16550A
[ 1.624590] 00:07: ttyS0 at I/O 0x3f8 (irq = 4) is a 16550A
[ 12.618301] usb 5-2: pl2303 converter now attached to ttyUSB0
[ 375.392303] pl2303 ttyUSB0: pl2303 converter now disconnected from ttyUSB0

这样程序中应该不难判断了吧。
【参考】http://www.cyberciti.biz/faq/find-out-linux-serial-ports-with-setserial/

❹ linux串口读取问题

首先你确定你那串口是否有东西可读? 就是你上面说的“一个文件不停的写数据到串口”!你可以先不这样读取,你可以在终端上用cat试试是否有数据可读:cat /dev/ttyS0

如果有的话,那你就检查串口设置是否正确,如波特率,数据位,停止位,校验位等!

最后就是你读取的函数了,看看先不要用printf打印字符串了,先看看十六进制是否有,然后再看字符等!

就是以上一些,你还可以参考Linux下串口文档,网络上很多的……

❺ linux串口读的都是历史数据

答:
是罩早的,linux串口读取的数据都是之前发指闷念送的历史数据。假如发送端由于某种原因没有将数据发送唯困出去,接收端将从串口读取先前发送的历史数据。

❻ linux怎么读取串口数据

用echo可以,不过需要一个串口的软件,就跟win的超级终端一样,开启后连接串口,然后毁棚另一边发送数据,你这边就能显示出来,我记得好像纤悉则叫做陆李minicom

❼ linux 串口每次读取8位

gps信息,以字符$开始,以字符 结尾。

你的代码问题处在对结尾的判断上。

每次读到数据后,首先应该放入一个缓冲区的后面。之后从缓冲区的第一个字节开始扫描,找到一对$和 ,然后打印该信息,并将后面的内容拷贝到前面。


读串口的误区:

  1. 读出来的信息是完整的。 串口的信息只是代表当时有多少数据,不保证数据是帧对其的。

  2. 即使第一次读到了$,不代表第二次读到的恰好是末尾的字符串。有可能更长(包含下一条信息的一部分)或者更短。

❽ linux想要获取串口参数信息,用c语言程序怎么实现呢类似下面的行吗

linux通过内核访问硬件,一般不允许直接访问硬件,除非你编写的是驱动程序。驱动程序必须是内核模块类的,直接挂载在内核的钩子(hook)上,有特殊的编写规则。
如何通过内核模块访问串口,要include kernel.h,里面有相应接口函数。

❾ Linux下如何使用c/c++实现检测新增串口,并读取串口号

Linux下面有设备文件
串口装好驱动御皮后 会显示在dev下
然后对这镇辩差个设备文件灶袭进行读写即可。
比windows要简单的多。

❿ 虚拟机下的linux怎么接受主机串口接收的数据

虚拟机中的串口连接可以采用两种方法。一种是指定虚拟机的串口连接到实际的COM上,例如开发机连接到COM1,目标机连接到COM2,然后把两个串口通过串口线相连接。另一种更为简便的方法是:在较高一些版本的VMware中都支持把串口映射到命名管道,把两个虚拟机的串口映射到同一个命名管道。例如,在两个虚拟机中都选定同一个命名管道 \\.\pipe\com_1,指定target机的COM口为server端,并选择"The other end is a virtual machine"属性;指定development机的COM口端为client端,同样指定COM口的"The other end is a virtual machine"属性。对于IO mode属性,在target上选中"Yield CPU on poll"复选择框,development机不选。

串口是开发者经常要使用到的,我们有些时候需要使用windows开发,然而window装在了虚拟机中,我们怎么样在虚拟机中使用串口呢?
1、在virtualbox中选择启用串口,端口模式选择Host device.
由于现有两个系统但是只有一个物理串口,所以虚拟机要通过主机的串口文件间接获取数据,主机是linux,串口设备为/dev/ttyS0
2、端口/文件位置一栏填入:/dev/ttyS0,启动虚拟机。
3、如果无法启动虚拟机,很有可能是没有对ttyS0设备的读写权限,(可以ls -l /dev/ttyS0查看以下权限)于是我们要修改ttyS0的权限,在终端中输入:sudo chmod 777 /dev/ttyS0 这样就将ttyS0的所有权限都打开了。启动虚拟机,这时候就可以在虚拟机中(winXP)使用串口了

热点内容
android制作jar 发布:2025-05-08 20:53:45 浏览:912
编译器用英语 发布:2025-05-08 20:49:53 浏览:79
linux嵌入式培训视频 发布:2025-05-08 20:49:42 浏览:220
电影类平台如何选择服务器 发布:2025-05-08 20:48:15 浏览:716
加密狗故障 发布:2025-05-08 20:48:01 浏览:591
我的世界服务器天堂陨落 发布:2025-05-08 20:47:21 浏览:340
怎么查主网服务器 发布:2025-05-08 20:37:04 浏览:213
linuxpython多版本 发布:2025-05-08 20:35:41 浏览:406
机器学习怎么编译代码 发布:2025-05-08 20:03:51 浏览:64
华硕电脑音频服务器未响应 发布:2025-05-08 20:01:39 浏览:761