Linux下串口編程

老闆讓我研究一下UPS的控制,貌似在Linux下面沒有相應的監控軟件,UPS和電腦通信時候使用的是串口(RS232),所以先對Linux串口編程瞭解一下。

因爲只是設計串口傳輸數據,而不需要串口來處理,那麼使用原始模式(Raw Mode)方式來通訊。


串口操作需要的頭文件:

#include	 <stdio.h>	  /*標準輸入輸出定義*/
 
#include	 <stdlib.h>	 /*標準函數庫定義*/
 
#include	 <unistd.h>	 /*Unix 標準函數定義*/
 
#include	 <sys/types.h>
 
#include	 <sys/stat.h>
 
#include	 <fcntl.h>	  /*文件控制定義*/
 
#include	 <termios.h>	/*PPSIX 終端控制定義*/
 
#include	 <errno.h>	  /*錯誤號定義*/



首先需要打開串口

在 Linux 下串口文件是位於 /dev 下的

串口一 爲 /dev/ttyS0

串口二 爲 /dev/ttyS1

打開串口是通過使用標準的文件打開函數操作:

int fd;
 
/*以讀寫方式打開串口*/
 
fd = open( "/dev/ttyS0", O_RDWR);
 
if (-1 == fd){
 
          /* 不能打開串口一*/
 
          perror(" 打開錯誤!");
 
}

然後對串口設置

串口設置設計的結構體如下:

struct termio
 
{	unsigned short  c_iflag;	/* 輸入模式標誌 */
 
	unsigned short  c_oflag;	/* 輸出模式標誌 */
 
	unsigned short  c_cflag;	/* 控制模式標誌*/
 
	unsigned short  c_lflag;	/* local mode flags */
 
	unsigned char   c_line;		/* line discipline */
 
	unsigned char   c_cc[NCC];	  /* control characters */
 
};

這裏僅對常用的設置進行介紹:

1.波特率設置:

struct  termios Opt;
 
tcgetattr(fd, &Opt);
 
tcflush(fd,TCIFLUSH);
 
cfsetispeed(&Opt,B19200);	 /*設置爲19200Bps*/
 
cfsetospeed(&Opt,B19200);

2.校驗位和停止位設置

常用的一般是8N0

Opt.c_cflag |= CS8;						  //設置數據位
 
Opt.c_cflag &= ~PARENB;
 
Opt.c_oflag &= ~(OPOST);
 
Opt.c_cflag &= ~CSTOPB;
 
Opt.c_lflag &= ~(ICANON|ISIG|ECHO|IEXTEN);
 
Opt.c_iflag &= ~(INPCK|BRKINT|ICRNL|ISTRIP|IXON);

Opt.c_cc[VMIN] = 0;
 
Opt.c_cc[VTIME] = 0;

3.寫入配置
if (tcsetattr(fd,TCSANOW,&Opt) != 0)	   //裝載初始化參數
 
{
 
   perror("SetupSerial!\n");
 
   close(fd);
 
   return -1;
 
}

測試串口

char buf[20];
 
 
 
for(;;)
 
{
 
len = write(fd, buf, 1);		//寫串口
 
if(len > 0)
 
{
 
read(fd, buf, sizeof(buf));	  //讀串口數據
 
printf("buf %s\n", buf);	//輸出讀到的數據
 
}
 
usleep(100000);
 
}


參考資料:

http://www.ibm.com/developerworks/cn/linux/l-serials/index.html
http://opengroup.org/onlinepubs/007908775/xsh/termios.h.html
http://hi.baidu.com/zy6666/blog/item/998da20e2c4634eb37d1220d.html






發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章