linux串口命令每5秒执行一次,linux下怪异串口编程问题,必须先启动一次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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值