青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

Linux 下串口編程入門

Linux 下串口編程入門

計算機串口的引腳定義

序號 信號名稱 符號 流向 功能
2 發送數據 TXD DTE→DCE DTE發送串行數據
3 接收數據 RXD DTE←DCE DTE 接收串行數據
4 請求發送 RTS DTE→DCE DTE 請求 DCE 將線路切換到發送方式
5 允許發送 CTS DTE←DCE DCE 告訴 DTE 線路已接通可以發送數據
6 數據設備準備好 DSR DTE←DCE DCE 準備好
7 信號地        信號公共地
8 載波檢測 DCD DTE←DCE 表示 DCE 接收到遠程載波
20 數據終端準備好 DTR DTE→DCE DTE 準備好
22 振鈴指示 RI DTE←DCE 表示 DCE 與線路接通,出現振鈴
串口操作

串口操作需要的頭文件

#include           /*標準輸入輸出定義*/
#include /*標準函數庫定義*/
#include /*Unix 標準函數定義*/
#include
#include
#include /*文件控制定義*/
#include /*PPSIX 終端控制定義*/
#include /*錯誤號定義*/

打開串口

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

串口一 為 /dev/ttyS0

串口二 為 /dev/ttyS1

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

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

設置串口

最基本的設置串口包括波特率設置,效驗位和停止位設置。

串口的設置主要是設置 struct termios 結構體的各成員值。

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 */
};

設置這個結構體很復雜,我這里就只說說常見的一些設置:

波特率設置

下面是修改波特率的代碼:

struct  termios Opt;
tcgetattr(fd, &Opt);
cfsetispeed(&Opt,B19200); /*設置為19200Bps*/
cfsetospeed(&Opt,B19200);
tcsetattr(fd,TCANOW,&Opt);
設置波特率的例子函數:
/**
*@brief 設置串口通信速率
*@param fd 類型 int 打開串口的文件句柄
*@param speed 類型 int 串口速度
*@return void
*/
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(fd1, TCSANOW, &Opt);
if (status != 0) {
perror("tcsetattr fd1");
return;
}
tcflush(fd,TCIOFLUSH);
}
}
}
效驗位和停止位的設置:
無效驗8位 Option.c_cflag &= ~PARENB;
Option.c_cflag &= ~CSTOPB;
Option.c_cflag &= ~CSIZE;
Option.c_cflag |= ~CS8;
奇效驗(Odd)7位 Option.c_cflag |= ~PARENB;
Option.c_cflag &= ~PARODD;
Option.c_cflag &= ~CSTOPB;
Option.c_cflag &= ~CSIZE;
Option.c_cflag |= ~CS7;
偶效驗(Even)7位 Option.c_cflag &= ~PARENB;
Option.c_cflag |= ~PARODD;
Option.c_cflag &= ~CSTOPB;
Option.c_cflag &= ~CSIZE;
Option.c_cflag |= ~CS7;
Space效驗7位 Option.c_cflag &= ~PARENB;
Option.c_cflag &= ~CSTOPB;
Option.c_cflag &= &~CSIZE;
Option.c_cflag |= CS8;
設置效驗的函數:
/**
*@brief 設置串口數據位,停止位和效驗位
*@param fd 類型 int 打開的串口文件句柄
*@param databits 類型 int 數據位 取值 為 7 或者8
*@param stopbits 類型 int 停止位 取值為 1 或者2
*@param parity 類型 int 效驗類型 取值為N,E,O,,S
*/
int set_Parity(int fd,int databits,int stopbits,int parity)
{
struct termios options;
if ( tcgetattr( fd,&options) != 0) {
perror("SetupSerial 1");
return(FALSE);
}
options.c_cflag &= ~CSIZE;
switch (databits) /*設置數據位數*/
{
case 7:
options.c_cflag |= CS7;
break;
case 8:
options.c_cflag |= CS8;
break;
default:
fprintf(stderr,"Unsupported data size\n"); return (FALSE);
}
switch (parity)
{
case 'n':
case 'N':
options.c_cflag &= ~PARENB; /* Clear parity enable */
options.c_iflag &= ~INPCK; /* Enable parity checking */
break;
case 'o':
case 'O':
options.c_cflag |= (PARODD | PARENB); /* 設置為奇效驗*/
options.c_iflag |= INPCK; /* Disnable parity checking */
break;
case 'e':
case 'E':
options.c_cflag |= PARENB; /* Enable parity */
options.c_cflag &= ~PARODD; /* 轉換為偶效驗*/
options.c_iflag |= INPCK; /* Disnable parity checking */
break;
case 'S':
case 's': /*as no parity*/
options.c_cflag &= ~PARENB;
options.c_cflag &= ~CSTOPB;break;
default:
fprintf(stderr,"Unsupported parity\n");
return (FALSE);
}
/* 設置停止位*/
switch (stopbits)
{
case 1:
options.c_cflag &= ~CSTOPB;
break;
case 2:
options.c_cflag |= CSTOPB;
break;
default:
fprintf(stderr,"Unsupported stop bits\n");
return (FALSE);
}
/* Set input parity option */
if (parity != 'n')
options.c_iflag |= INPCK;
tcflush(fd,TCIFLUSH);
options.c_cc[VTIME] = 150; /* 設置超時15 seconds*/
options.c_cc[VMIN] = 0; /* Update the options and do it NOW */
if (tcsetattr(fd,TCSANOW,&options) != 0)
{
perror("SetupSerial 3");
return (FALSE);
}
return (TRUE);
}

需要注意的是:

如果不是開發終端之類的,只是串口傳輸數據,而不需要串口來處理,那么使用原始模式(Raw Mode)方式來通訊,設置方式如下:

options.c_lflag  &= ~(ICANON | ECHO | ECHOE | ISIG);  /*Input*/
options.c_oflag &= ~OPOST; /*Output*/

讀寫串口

設置好串口之后,讀寫串口就很容易了,把串口當作文件讀寫就是。

發送數據
char  buffer[1024];int    Length;int    nByte;nByte = write(fd, buffer ,Length)
讀取串口數據

使用文件操作read函數讀取,如果設置為原始模式(Raw Mode)傳輸數據,那么read函數返回的字符數是實際串口收到的字符數。

可以使用操作文件的函數來實現異步讀取,如fcntl,或者select等來操作。

char  buff[1024];int    Len;int  readByte = read(fd,buff,Len);

關閉串口

關閉串口就是關閉文件。

close(fd);

posted on 2009-06-28 23:16 王光平 閱讀(799) 評論(1)  編輯 收藏 引用 所屬分類: linux世界

評論

# re: Linux 下串口編程入門 2009-06-29 10:35 allen

"#include"后面的看不見  回復  更多評論   

<2009年8月>
2627282930311
2345678
9101112131415
16171819202122
23242526272829
303112345

導航

統計

留言簿(4)

隨筆分類

隨筆檔案

搜索

最新評論

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            国产欧美日韩另类视频免费观看| 欧美1区3d| 国产主播精品在线| 国产偷国产偷亚洲高清97cao| 国产精品成人一区二区三区夜夜夜| 欧美精品免费视频| 欧美性猛交xxxx免费看久久久 | 国产日韩在线看片| 国产亚洲精品久久久久婷婷瑜伽| 国产色婷婷国产综合在线理论片a| 国产偷国产偷亚洲高清97cao| 黄色一区二区三区| 99精品国产福利在线观看免费| 99视频一区二区三区| 亚洲精品网址在线观看| 99ri日韩精品视频| 欧美一区二区精品久久911| 久久精品电影| 欧美激情网站在线观看| 亚洲日本成人| 亚洲综合精品一区二区| 久久午夜精品一区二区| 欧美日韩免费观看一区二区三区| 国产精品久久久久久久久久免费看 | 欧美黄色aa电影| 欧美韩国日本综合| 国产乱码精品一区二区三区av| 韩国一区电影| 亚洲一区日韩在线| 欧美成人高清视频| 亚洲一区二区三区久久| 欧美一级电影久久| 亚洲国产精品va| 欧美在线电影| 欧美午夜一区二区| 亚洲激情视频在线播放| 午夜精品免费在线| 亚洲欧洲一级| 久久一本综合频道| 国产欧美一区二区精品性| 99v久久综合狠狠综合久久| 久久久久久伊人| 亚洲天堂成人在线观看| 欧美激情第五页| 在线欧美日韩国产| 久久国产一区二区三区| 亚洲深夜激情| 欧美日韩你懂的| 日韩视频一区二区| 欧美国产日韩免费| 久久久噜噜噜久久人人看| 国产欧美日韩另类视频免费观看| 99热在这里有精品免费| 欧美激情中文不卡| 免费在线成人av| 亚洲福利免费| 免费亚洲一区二区| 久久九九精品99国产精品| 国产日韩一区二区三区| 久久精品99国产精品日本| 亚洲制服少妇| 国产欧美三级| 久久婷婷色综合| 久久久一区二区| 亚洲第一主播视频| 欧美激情性爽国产精品17p| 久久久视频精品| 亚洲国产精品美女| 欧美国产免费| 欧美日韩国产一区二区三区| 一本大道av伊人久久综合| 亚洲精品在线视频| 国产精品成人一区二区三区吃奶| 亚洲午夜一级| 欧美在线一二三四区| 欧美日韩精品免费观看视频| 欧美精品一区二区精品网| 一本到12不卡视频在线dvd| 91久久精品国产91性色tv| 欧美日韩aaaaa| 午夜在线一区| 久久尤物视频| 亚洲视频网站在线观看| 午夜国产精品视频免费体验区| 国内久久视频| 亚洲娇小video精品| 欧美日一区二区三区在线观看国产免 | 另类天堂av| 99re这里只有精品6| 亚洲一区久久久| 亚洲福利视频网站| 一区二区三区精品视频在线观看| 国产欧美午夜| 最新国产拍偷乱拍精品 | 欧美激情网友自拍| 亚洲欧美一级二级三级| 久久精品中文| 中国日韩欧美久久久久久久久| 午夜在线视频观看日韩17c| 在线日韩av永久免费观看| 一区二区免费看| 亚洲成人在线视频播放| 亚洲视频一区二区在线观看| 狠狠色香婷婷久久亚洲精品| 亚洲精品一品区二品区三品区| 国产欧美日韩91| 亚洲精选视频免费看| 国产午夜精品一区二区三区视频| 亚洲国产精品va在线看黑人| 国产视频久久久久久久| 一本一道久久综合狠狠老精东影业 | 久久精品日韩欧美| 欧美视频不卡| 亚洲欧洲日韩在线| 亚洲激情成人网| 久久国产婷婷国产香蕉| 午夜精品久久久久久| 欧美久久视频| 最新国产成人在线观看| 亚洲国产精品va| 久久视频一区二区| 另类图片国产| 国语自产偷拍精品视频偷| 91久久久久| 久久国产精品久久久| 午夜在线视频观看日韩17c| 欧美日韩国产色视频| 欧美黄色影院| 亚洲第一区色| 久久只精品国产| 欧美sm视频| 91久久精品国产91性色tv| 麻豆精品视频| 欧美激情影音先锋| 欧美一区二区视频在线观看| 欧美18av| 尤物精品在线| 久久综合给合| 欧美国产日韩精品| 日韩视频精品在线| 欧美日韩精品福利| 一本色道久久| 午夜精品免费| 国产主播精品| 免费观看在线综合色| 亚洲电影成人| 亚洲无毛电影| 国产伦精品一区二区三区四区免费| 亚洲一区二区三区涩| 性一交一乱一区二区洋洋av| 国产日韩在线播放| 美女999久久久精品视频| 欧美国产精品日韩| 一区二区三区四区蜜桃| 国产精品久久久久久av福利软件| 亚洲一区二区免费| 久久综合福利| 一本色道婷婷久久欧美| 国产精品成人一区二区三区吃奶| 亚洲欧美日韩精品久久久久| 久久久www成人免费精品| 亚洲国产电影| 国产精品色午夜在线观看| 久久国内精品视频| 亚洲精品一区二区三区蜜桃久| 亚洲一区二区三区四区五区黄| 国产欧美一二三区| 欧美大胆人体视频| 午夜视频在线观看一区| 欧美国产极速在线| 欧美一区二区视频免费观看| 亚洲激情影院| 国产精品永久免费视频| 狂野欧美一区| 亚洲自拍偷拍麻豆| 亚洲国产美女| 久久久久久自在自线| 亚洲视频一起| 亚洲国产美女| 国产亚洲欧美日韩一区二区| 欧美日韩国产综合视频在线| 久久精品综合| 亚洲一区二区在线观看视频| 免费久久99精品国产自在现线| 在线视频一区观看| 亚洲黄色成人久久久| 国产区日韩欧美| 国产精品扒开腿做爽爽爽视频| 久久久久久九九九九| 亚洲一区三区在线观看| 最新国产拍偷乱拍精品| 欧美sm视频| 久久久噜噜噜久久中文字免| 亚洲网站在线观看| 日韩一级免费观看| 亚洲精品一区二| 亚洲三级免费| 亚洲高清视频在线观看| 狠狠88综合久久久久综合网| 国产精品免费aⅴ片在线观看|