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

linux串口获取

发布时间: 2022-09-20 23:38:14

A. 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;
}

B. linux 串口读取数据被截断,怎样一次全部接收

没办法保证能够一次全部接收,只能自己缓存起来处理。比如,发送数据时候增加带有长度的数据头以及末尾的校验,用 select 对串口做非阻塞读取,读到数据后检查是否完整,不完整就接着读,直到获得完整数据再处理。

C. linux串口读取问题

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

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

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

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

D. linux下,用什么工具可以抓串口的数据

对于picocom, kermit, minicom, picocom 最简单易用,也完全符合我的使用需求。
安装(mint / ubuntu):
$ sudo apt-get install picocom
使用:
$ picocom -b 115200 /dev/ttyUSB0
(/dev/ttyUSB0 为串口设备文件,如果用的不是USB转串口,则为 /dev/ttyS*)
(可以设置一个别名,如 alias pc='picocom -b 115200 /dev/ttyUSB0',这样在终端输入 sudo pc 就可以打开终端了)
退出:
Ctrl-a 是转义键,按 Ctrl-a Ctrl-q 就可以退出终端。

E. 虚拟机下的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)使用串口了

F. 请问程序中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/

热点内容
内置存储卡可以拆吗 发布:2025-05-18 04:16:35 浏览:336
编译原理课时设置 发布:2025-05-18 04:13:28 浏览:378
linux中进入ip地址服务器 发布:2025-05-18 04:11:21 浏览:612
java用什么软件写 发布:2025-05-18 03:56:19 浏览:32
linux配置vim编译c 发布:2025-05-18 03:55:07 浏览:107
砸百鬼脚本 发布:2025-05-18 03:53:34 浏览:945
安卓手机如何拍视频和苹果一样 发布:2025-05-18 03:40:47 浏览:742
为什么安卓手机连不上苹果7热点 发布:2025-05-18 03:40:13 浏览:803
网卡访问 发布:2025-05-18 03:35:04 浏览:511
接收和发送服务器地址 发布:2025-05-18 03:33:48 浏览:372