老闆讓我研究一下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