#include
#include
#include
#include /*文件控制定义*/
#include /*PPSIX 终端控制定义*/
void set_speed(int, int);
int main()
{
int fd,flag,wr_num=0,rd_num=0;
struct termios term;
speed_t baud_rate_i,baud_rate_o;
char send_buf[]="hello,serial!",recv_buf[20];
fd=open("/dev/ttyS0",O_RDWR|O_NONBLOCK); /*要用O_NOBLOCK 否则读数据时会出问题*/
if(fd==-1)
printf("can not open the COM1!\n");
else
printf("open COM1 ok!\n");
flag=tcgetattr(fd,&term);/*取得终端设备fd的属性,存放在termios类型的结构体term中*/
baud_rate_i=cfgetispeed(&term);/*从term中读取输入波特率*/
baud_rate_o=cfgetospeed(&term);/*从term中读取输出波特率*/
printf("输入波特率是%d,输出波特率是%d,文件描述符是%d\n",baud_rate_i,baud_rate_o,fd);
set_speed(fd,9600);/*设置波特率*/
flag=tcgetattr(fd,&term);
/*以下三行读取设置之后的波特率,用cfgetispeed和cfgetospeed得到的波特率是一个序号,可以通过查表(表见程序后面)得到真正的波特率,比如返回13,对应的实际波特率是9600。我这里没有做转换,直接把13输出了。*/
baud_rate_i=cfgetispeed(&term);
baud_rate_o=cfgetospeed(&term);
printf("输入波特率是%d,输出波特率是%d,文件描述符是%d\n",baud_rate_i,baud_rate_o,fd);
while(1)
{
wr_num=write(fd,send_buf,sizeof(send_buf));/*先写入*/
if(wr_num>0)
printf("write success!\n");
else
printf("write fail!\n");
sleep(1);
rd_num=read(fd,recv_buf,sizeof(recv_buf));/*再读出*/
if(rd_num>0)
printf("we can read \"%s\" from the COM1.total:%d characters\n",recv_buf,rd_num);
else
printf("read fail!\n");
sleep(2);
}
}
/***下面这个set_speed的子程序是在网上别的文章中摘抄过来的,就直接调用了,省了自己编写的麻烦***/
int speed_arr[] = {B38400, B19200, B9600, B4800, B2400, B1200, B300,
B38400, B19200, B9600, B4800, B2400, B1200, B300, };
int name_arr[] = {38400, 19200, 9600, 4800, 2400, 1200, 300, 38400,
19200, 9600, 4800, 2400, 1200, 300, };
void set_speed(int fd, int speed){
int i;
int status;
struct termios Opt;
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("tcsetattr fd1");
return;
}
tcflush(fd,TCIOFLUSH);
}
}
}
阅读(753) | 评论(0) | 转发(0) |