IT培训机构|91免费精品视频|专注编程培训|91免费精品|软件开发培训_91免费国产视频_华清远见教育

當(dāng)前位置:首頁 > 嵌入式培訓(xùn) > 嵌入式學(xué)習(xí) > 講師博文 > 資深程序員告訴你串口配置的詳細(xì)流程,不容錯(cuò)過

資深程序員告訴你串口配置的詳細(xì)流程,不容錯(cuò)過 時(shí)間:2018-06-20      來源:未知

1,按照通信的基本方式分類,可以分為以下兩類:

1)并行通信

2)串行通信兩種。

并行通信是指利用多條數(shù)據(jù)傳輸線將一個(gè)資料的各位同時(shí)傳送。它的特點(diǎn)是傳輸速度

快,適用于短距離通信,但要求傳輸速度較高的應(yīng)用場合。

串行通信是指利用一條傳輸線將資料一位位地順序傳送。特點(diǎn)是通信線路簡單,利用

簡單的線纜就可實(shí)現(xiàn)通信,降低成本,適用于遠(yuǎn)距離通信,但傳輸速度慢的應(yīng)用場合。

那么接下來我們就來分析串口設(shè)置:

一般情況下,我們對串口中最基本的包括:波特率設(shè)置,校驗(yàn)位和停止位設(shè)置。然而串口的設(shè)置主要是設(shè)置struct termios結(jié)構(gòu)體的各成員值,如下所示:

struct termio

{

unsigned short c_iflag; /* 輸入模式標(biāo)志 */

unsigned short c_oflag; /* 輸出模式標(biāo)志 */

unsigned short c_cflag; /* 控制模式標(biāo)志*/

unsigned short c_lflag; /*本地模式標(biāo)志 */

unsigned char c_line; /* line discipline */

unsigned char c_cc[NCC]; /* control characters */

};

在這個(gè)結(jié)構(gòu)中最為重要的是c_cflag,通過對它的賦值,用戶可以設(shè)置波特率、字符大小、

數(shù)據(jù)位、停止位、奇偶校驗(yàn)位和硬件流控等。另外c_iflag 和c_cc 也是比較常用的標(biāo)志。

波特率:即每秒傳輸?shù)奈粩?shù),一般情況下有以下幾種:

B0 0波特率(放棄DTR)

B1800 1800波特率

B2400 2400波特率

B4800 4800波特率

B9600 9600波特率

B19200 19200波特率

B38400 38400波特率

B57600 57600波特率

B115200 115200波特率

int set_opt(int fd,int nSpeed, int nBits, char nEvent, int nStop)

{

struct termios newtio,oldtio;

/*保存測試現(xiàn)有串口參數(shù)設(shè)置,在這里如果串口號等出錯(cuò),會有相關(guān)的出錯(cuò)信息*/

if ( tcgetattr( fd,&oldtio) != 0)

{

perror("SetupSerial 1");

return -1;

}

bzero( &newtio, sizeof( newtio ) );

/*步驟一,設(shè)置字符大小*/

newtio.c_cflag |= CLOCAL | CREAD;

newtio.c_cflag &= ~CSIZE;

/*設(shè)置停止位*/

switch( nBits )

{

case 7:

newtio.c_cflag |= CS7;

break;

case 8:

newtio.c_cflag |= CS8;

break;

}

/*設(shè)置奇偶校驗(yàn)位*/

switch( nEvent )

{

case 'O': //奇數(shù)

newtio.c_cflag |= PARENB;

newtio.c_cflag |= PARODD;

newtio.c_iflag |= (INPCK | ISTRIP);

break;

case 'E': //偶數(shù)

newtio.c_iflag |= (INPCK | ISTRIP);

newtio.c_cflag |= PARENB;

newtio.c_cflag &= ~PARODD;

break;

case 'N': //無奇偶校驗(yàn)位

newtio.c_cflag &= ~PARENB;

break;

}

/*設(shè)置波特率*/

switch( nSpeed )

{

case 2400:

cfsetispeed(&newtio, B2400);

cfsetospeed(&newtio, B2400);

break;

case 4800:

cfsetispeed(&newtio, B4800);

cfsetospeed(&newtio, B4800);

break;

case 9600:

cfsetispeed(&newtio, B9600);

cfsetospeed(&newtio, B9600);

break;

case 115200:

cfsetispeed(&newtio, B115200);

cfsetospeed(&newtio, B115200);

break;

case 460800:

cfsetispeed(&newtio, B460800);

cfsetospeed(&newtio, B460800);

break;

default:

cfsetispeed(&newtio, B9600);

cfsetospeed(&newtio, B9600);

break;

}

/*設(shè)置停止位*/

if( nStop == 1 )

newtio.c_cflag &= ~CSTOPB;

else if ( nStop == 2 )

newtio.c_cflag |= CSTOPB;

/*設(shè)置等待時(shí)間和最小接收字符*/

newtio.c_cc[VTIME] = 0;

newtio.c_cc[VMIN] = 0;

/*處理未接收字符*/

tcflush(fd,TCIFLUSH);

/*激活新配置*/

if((tcsetattr(fd,TCSANOW,&newtio))!=0)

{

perror("com set error");

return -1;

}

printf("set done!\n");

return 0;

}

在配置完串口的相關(guān)屬性后,就可對串口進(jìn)行打開,讀寫操作了。其使用方式與文件操作一樣,區(qū)別在于串口是一個(gè)終端設(shè)備。

2,打開串口:

串口位于/dev中,可作為標(biāo)準(zhǔn)文件的形式打開,其中:

串口1 /dev/ttyS0

串口2 /dev/ttyS1

fd = open( "/dev/ttyS0", O_RDWR|O_NOCTTY|O_NDELAY);

Open函數(shù)中除普通參數(shù)外,另有兩個(gè)參數(shù)O_NOCTTY和O_NDELAY。

O_NOCTTY: 通知linix系統(tǒng),這個(gè)程序不會成為這個(gè)端口的控制終端。

O_NDELAY: 通知Linux系統(tǒng)不關(guān)心DCD信號線所處的狀態(tài)(端口的另一端是否激活或者停止)。

然后,恢復(fù)串口的狀態(tài)為阻塞狀態(tài),用于等待串口數(shù)據(jù)的讀入。用fcntl函數(shù):

fcntl(fd, F_SETFL, 0);

接著,測試打開的文件描述府是否引用一個(gè)終端設(shè)備,以進(jìn)一步確認(rèn)串口是否正確打開。

isatty(STDIN_FILENO);

串口的讀寫與普通文件一樣,使用read,write函數(shù)。

read(fd,buff,8);

write(fd,buff,8);

3,linux串口編程需要的頭文件

#include //標(biāo)準(zhǔn)輸入輸出定義

#include //標(biāo)準(zhǔn)函數(shù)庫定義

#include //Unix標(biāo)準(zhǔn)函數(shù)定義

#include

#include

#include //文件控制定義

#include //POSIX中斷控制定義

#include //錯(cuò)誤號定義

4,設(shè)置數(shù)據(jù)位、停止位和校驗(yàn)位

以下是幾個(gè)數(shù)據(jù)位、停止位和校驗(yàn)位的設(shè)置方法:(以下均為1位停止位)

8位數(shù)據(jù)位、無校驗(yàn)位:

Opt.c_cflag &= ~PARENB;

Opt.c_cflag &= ~CSTOPB;

Opt.c_cflag &= ~CSIZE;

Opt.c_cflag |= CS8;

7位數(shù)據(jù)位、奇校驗(yàn):

Opt.c_cflag |= PARENB;

Opt.c_cflag |= PARODD;

Opt.c_cflag &= ~CSTOPB;

Opt.c_cflag &= ~CSIZE;

Opt.c_cflag |= CS7;

7位數(shù)據(jù)位、偶校驗(yàn):

Opt.c_cflag |= PARENB;

Opt.c_cflag &= ~PARODD;

Opt.c_cflag &= ~CSTOPB;

Opt.c_cflag &= ~CSIZE;

Opt.c_cflag |= CS7;

7位數(shù)據(jù)位、Space校驗(yàn):

Opt.c_cflag &= ~PARENB;

Opt.c_cflag &= ~CSTOPB;

Opt.c_cflag &= ~CSIZE;

Opt.c_cflag |= CS7;

5,某些設(shè)置項(xiàng)

在上面我們看到一些比較特殊的設(shè)置,下面簡述一下他們的作用。

c_cc數(shù)組的VSTART和VSTOP元素被設(shè)定成DC1和DC3,代表ASCII標(biāo)準(zhǔn)的XON和XOFF字符,如果在傳輸這兩個(gè)字符的時(shí)候就傳不過去,需要把軟件流控制屏蔽,即:

Opt.c_iflag &= ~ (IXON | IXOFF | IXANY);

有時(shí)候,在用write發(fā)送數(shù)據(jù)時(shí)沒有鍵入回車,信息就發(fā)送不出去,這主要是因?yàn)槲覀冊谳斎胼敵鰰r(shí)是按照規(guī)范模式接收到回車或換行才發(fā)送,而更多情況下我們是不必鍵入回車或換行的。此時(shí)應(yīng)轉(zhuǎn)換到行方式輸入,不經(jīng)處理直接發(fā)送,設(shè)置如下:

Opt.c_lflag &= ~ (ICANON | ECHO | ECHOE | ISIG);

還存在這樣的情況:發(fā)送字符0X0d的時(shí)候,往往接收端得到的字符是0X0a,原因是因?yàn)樵诖谠O(shè)置中c_iflag和c_oflag中存在從NL-CR和CR-NL的映射,即串口能把回車和換行當(dāng)成同一個(gè)字符,可以進(jìn)行如下設(shè)置屏蔽之:

Opt.c_iflag &= ~ (INLCR | ICRNL | IGNCR);

Opt.c_oflag &= ~(ONLCR | OCRNL);

注意:控制符VTIME和VMIN之間有復(fù)雜的關(guān)系。VTIME定義要求等待的時(shí)間(百毫米,通常是unsigned char變量),而VMIN定義了要求等待的最小字節(jié)數(shù)(相比之下,read函數(shù)的第三個(gè)參數(shù)指定了要求讀的最大字節(jié)數(shù))。

如果VTIME=0,VMIN=要求等待讀取的最小字節(jié)數(shù),read必須在讀取了VMIN個(gè)字節(jié)的數(shù)據(jù)或者收到一個(gè)信號才會返回。

如果VTIME=時(shí)間量,VMIN=0,不管能否讀取到數(shù)據(jù),read也要等待VTIME的時(shí)間量。

如果VTIME=時(shí)間量,VMIN=要求等待讀取的最小字節(jié)數(shù),那么將從read讀取第一個(gè)字節(jié)的數(shù)據(jù)時(shí)開始計(jì)時(shí),并會在讀取到VMIN個(gè)字節(jié)或者VTIME時(shí)間后返回。

如果VTIME=0,VMIN=0,不管能否讀取到數(shù)據(jù),read都會立即返回

讀寫串口

發(fā)送數(shù)據(jù)方式如下,write函數(shù)將返回寫的位數(shù)或者當(dāng)錯(cuò)誤時(shí)為-1。

char buffer[1024];

int length;

int nByte;

nByte = write(fd, buffer, length);

讀取數(shù)據(jù)方式如下,原始數(shù)據(jù)模式下每個(gè)read函數(shù)將返回實(shí)際串口收到的字符數(shù),如果串口中沒有字符可用,回叫將會阻塞直到以下幾種情況:有字符進(jìn)入;一個(gè)間隔計(jì)時(shí)器失效;錯(cuò)誤發(fā)送。

在打開串口成功后,使用fcntl(fd, F_SETFL, FNDELAY)語句,可以使read函數(shù)立即返回而不阻塞。FNDELAY選項(xiàng)使read函數(shù)在串口無字符時(shí)立即返回且為0。

char buffer[1024];

int length;

int readByte;

readByte = read(fd, buffer, len);

注 意:設(shè)置為原始模式傳輸數(shù)據(jù)的話,read函數(shù)返回的字符數(shù)是實(shí)際串口收到的字符數(shù)。Linux下直接用read讀串口可能會造成堵塞,或者數(shù)據(jù)讀出錯(cuò) 誤,此時(shí)可使用tcntl或者select等函數(shù)實(shí)現(xiàn)異步讀取。用select先查詢com口,再用read去讀就可以避免上述錯(cuò)誤。

6,關(guān)閉串口

串口作為文件來處理,所以一般的關(guān)閉文件函數(shù)即可:

close(fd);

上一篇:socket進(jìn)程間通信方式大總結(jié),還有典型實(shí)例哦

下一篇:linux進(jìn)程間通信-FIFO,讓你全方位理解

熱點(diǎn)文章推薦
華清學(xué)員就業(yè)榜單
高薪學(xué)員經(jīng)驗(yàn)分享
熱點(diǎn)新聞推薦
前臺專線:010-82525158 企業(yè)培訓(xùn)洽談專線:010-82525379 院校合作洽談專線:010-82525379 Copyright © 2004-2022 北京華清遠(yuǎn)見科技集團(tuán)有限公司 版權(quán)所有 ,京ICP備16055225號-5京公海網(wǎng)安備11010802025203號

回到頂部

主站蜘蛛池模板: 深圳心理咨询-专业心理咨询服务平台「专家免费在线」-深圳从心开始心理O2O | 消防改造安装,消防维修检测,消防工程安装,气体灭火施工安装,火灾烟感探测器清洗 | 长沙网站建设,网站设计制作,长沙小程序开发,公众号开发,长沙叶老设计 | 厦门公司注册-提供工商登记记账代理服务和营业执照代办地址与注册流程及费用 | 外圆/圆管抛光机_方管抛光机/除锈机_活塞杆抛光机-不锈钢管抛光机-邢台欧邦机械 | 曙海培训-ZEMAX培训射频培训无线电培训GMS培训EMC培训电磁兼容性培训Maxwell培训欧姆龙培训procast培训可靠性培训光学培训工业机器人培训NI培训Linux培训5G培训Hadoop培训CFD培训 | 烘干机_回转窑_破碎机_制砂机_洗砂机_球磨机-瑞光金属制品 | 山东万利精密机械制造有限公司-高速金属圆锯机,数控高速圆锯机,高速圆锯机生产厂家 | 誉瑞仪器是全球知名检测仪器厂商RAE在华东地区的专业级产品销售及授权维修服务商- | 山东正奇塑料机械有限公司,山东塑料机械,水带机组,塑料管材机,山东吹膜机组厂家,山东农膜机厂家 山东长青石油液压机械有限公司-致力于石油机械设备的研发制造,提供定制服务 | 气胀轴丨安全夹头丨电磁制动器丨纠偏系统丨磁粉离合器丨张力控制器厂家- 东莞天机通信科技有限公司 | 河南郑州纯净水设备_厂家_价格_河南江宇环保科技有限公司水处理设备工厂 | 健力普医疗-半导体激光治疗仪,红外偏振光治疗仪,近红外线治疗仪-独家功能,光疗典范 | 柔性电缆-专业机器人电缆,拖链电缆生产厂家 | 实验反应釜,高压反应釜,玻璃反应釜,不锈钢反应釜-烟台招远松岭化工设备有限公司 | 泰州光明会计师事务所有限公司-财务业务审计,会计服务业务及资产评估业务的专业服务机构 | 南京文化墙设计公司,南京包装设计制作印刷,南京PPT设计公司,导视制作公司,企业logo设计 | 膨胀节_波纹膨胀节_非金属膨胀节_波纹管补偿器_膨胀节厂家-江苏苏创管业科技有限公司 | 无心磨床- 无锡润一机床有限公司 | 卓尚服饰(杭州)有限公司邮箱| 上海vi设计公司_logo设计_包装设计_品牌定位策划公司-焕识品牌设计 - | 厦门,泉州自助餐上门|生日自助餐|婚礼自助餐|公司聚会自助餐|户外烧烤|冷餐|茶歇外卖配送-福建非选餐饮公司 | 网络广播_公共广播系统_校园,学校数字ip,itc智能广播系统方案 | 永磁变频空压机-无油空压机-螺杆式空压机热能回收-空压机配套-空压机合同能源管理-维修保养-北京斯特兰压缩机有限公司 | 上海叶拓科技有限公司 | 移动破碎站-洗沙机-球磨制砂机-污泥处理-青州冠诚重工机械有限公司 | 市南人才网_市南招聘网_求职找工作平台 | 上海上市答谢酒会_企业年会_新品上市发布会_周年/开业庆典_会议会务_活动策划布置演出公司 | 全彩LED显示屏厂家_室内户外电子屏-深圳华邦瀛光电有限公司 | 快达物流:电商和微商的仓储物流外包和托管服务-北京快达国际物流服务有限公司官方网站 | 全自动视觉点胶机|在线式点胶机|精密点胶阀设备厂家-杭州迈伺特科技有限公司 | 南京叉车|电瓶叉车|电动叉车|电动堆高车|电动搬运车-南京诺嘉机械 | 润东方环保空调厂家-水冷式空调价格-润东方水冷空调-东莞市科骏机电设备有限公司 | 江苏美鑫食品科技有限公司| 潍坊网络推广,临沂360推广,东营360推广,枣庄360推广,潍坊网站建设,潍坊网络公司,潍坊360搜索,潍坊APP开发,潍坊360推广,潍坊360代理,潍坊点睛网络科技有限公司 | 三轴伺服机械手_五轴伺服机械手_注塑机械手_东莞市浩能自动化机械有限公司 | 图表秀——免费在线图表制作工具,数据可视化工具 | 永磁变频空压机_青岛空压机_螺杆空压机_口罩专用空压机-青岛凯瑞特机电设备有限公司 | 深圳汽车贴膜_深圳全车车身改色贴膜|UPPF隐形车衣官网 | 览众房车,房车, 房车厂家, 房车价格, 房车图片,, 四驱房车, 皮卡房车, 越野房车, 依维柯房车, 国产房车, 自动挡房车, | 陕西散花照明-西安太阳能路灯,陕西太阳能路灯,西安太阳能路灯厂家,陕西太阳能路灯厂家 |