当前位置: 技术问答>linux和unix
linux下怪异串口编程问题,必须先启动一次minicom后程序才能收到数据
来源: 互联网 发布时间:2016-12-08
本文导语: 在linux下使用C语言编写一个接收串口数据的程序,从网上找了部分代码,结合自己的一些东西编写了一个程序。但是运行之后收不到数据,于是启动minicom进行调试,发现在minicom下可以收到数据,于是关闭minicom,再次...
在linux下使用C语言编写一个接收串口数据的程序,从网上找了部分代码,结合自己的一些东西编写了一个程序。但是运行之后收不到数据,于是启动minicom进行调试,发现在minicom下可以收到数据,于是关闭minicom,再次运行程序,程序竟可以正常工作了,可以接收串口的数据了。
然后重启计算机,该问题又重复出现了,不事先启动一次minicom,程序无法收到数据。
我怀疑是我的串口接收程序没有对串口做好初始化,当minicom启动时,minicom对串口做了某些初始化,然后关闭minicom后,我的程序就也能运行了。但问题是我现在无法找出到底少了哪一部分的初始化工作。现在把代码贴在下面,希望有高手能帮一下忙看看到底是少了哪一点,不胜感谢。
/******************************* 读取串口程序 ********************************/
#include
#include
#include
#include
#include
#include
void set_speed(int, int);
int main()
{
int fd,flag,rd_num=0;
struct termios term;
struct timeval timeout;
speed_t baud_rate_i,baud_rate_o;
char recv_buf[20];
fd=open("/dev/ttyS0",O_RDWR|O_NONBLOCK);
if(fd==-1)
printf("can not open the COM1!n");
else
printf("open COM1 ok!n");
flag=tcgetattr(fd,&term);
baud_rate_i=cfgetispeed(&term);
baud_rate_o=cfgetospeed(&term);
printf("设置之前的输入波特率是%d,输出波特率是%dn",baud_rate_i,baud_rate_o);
set_speed(fd,9600);
flag=tcgetattr(fd,&term);
baud_rate_i=cfgetispeed(&term);
baud_rate_o=cfgetospeed(&term);
printf("设置之后的输入波特率是%d,输出波特率是%dn",baud_rate_i,baud_rate_o);
int transfer_started=0;
int i=0;
while(1)
{
rd_num=read(fd,recv_buf,sizeof(recv_buf));
timeout.tv_sec=0;
timeout.tv_usec=200000;
if(rd_num>0)
{
printf("%d(间隔%4.3fs):we can read "%s" from the COM1,total:%d characters.n",++i,timeout.tv_sec+timeout.tv_usec*0.000001,recv_buf,rd_num);
transfer_started=1;
}
else
printf("%d(间隔%4.3fs):read fail! rd_num=%d。本次数据传输%sn",++i,timeout.tv_sec+timeout.tv_usec*0.000001,rd_num,transfer_started==1?"已经结束":"尚未开始");
// sleep(1); 粗糙定时
select(0,NULL,NULL,NULL,&timeout);/*精确定时*/
}
}
int speed_arr[] = {B115200, B38400, B19200, B9600, B4800, B2400, B1200, B300};
int name_arr[] = {115200, 38400, 19200, 9600, 4800, 2400, 1200, 300};
void set_speed(int fd, int speed){
unsigned int i;
int status;
struct termios Opt;
tcgetattr(fd, &Opt);
for ( i= 0; i
然后重启计算机,该问题又重复出现了,不事先启动一次minicom,程序无法收到数据。
我怀疑是我的串口接收程序没有对串口做好初始化,当minicom启动时,minicom对串口做了某些初始化,然后关闭minicom后,我的程序就也能运行了。但问题是我现在无法找出到底少了哪一部分的初始化工作。现在把代码贴在下面,希望有高手能帮一下忙看看到底是少了哪一点,不胜感谢。
/******************************* 读取串口程序 ********************************/
#include
#include
#include
#include
#include
#include
void set_speed(int, int);
int main()
{
int fd,flag,rd_num=0;
struct termios term;
struct timeval timeout;
speed_t baud_rate_i,baud_rate_o;
char recv_buf[20];
fd=open("/dev/ttyS0",O_RDWR|O_NONBLOCK);
if(fd==-1)
printf("can not open the COM1!n");
else
printf("open COM1 ok!n");
flag=tcgetattr(fd,&term);
baud_rate_i=cfgetispeed(&term);
baud_rate_o=cfgetospeed(&term);
printf("设置之前的输入波特率是%d,输出波特率是%dn",baud_rate_i,baud_rate_o);
set_speed(fd,9600);
flag=tcgetattr(fd,&term);
baud_rate_i=cfgetispeed(&term);
baud_rate_o=cfgetospeed(&term);
printf("设置之后的输入波特率是%d,输出波特率是%dn",baud_rate_i,baud_rate_o);
int transfer_started=0;
int i=0;
while(1)
{
rd_num=read(fd,recv_buf,sizeof(recv_buf));
timeout.tv_sec=0;
timeout.tv_usec=200000;
if(rd_num>0)
{
printf("%d(间隔%4.3fs):we can read "%s" from the COM1,total:%d characters.n",++i,timeout.tv_sec+timeout.tv_usec*0.000001,recv_buf,rd_num);
transfer_started=1;
}
else
printf("%d(间隔%4.3fs):read fail! rd_num=%d。本次数据传输%sn",++i,timeout.tv_sec+timeout.tv_usec*0.000001,rd_num,transfer_started==1?"已经结束":"尚未开始");
// sleep(1); 粗糙定时
select(0,NULL,NULL,NULL,&timeout);/*精确定时*/
}
}
int speed_arr[] = {B115200, B38400, B19200, B9600, B4800, B2400, B1200, B300};
int name_arr[] = {115200, 38400, 19200, 9600, 4800, 2400, 1200, 300};
void set_speed(int fd, int speed){
unsigned int i;
int status;
struct termios Opt;
tcgetattr(fd, &Opt);
for ( i= 0; i