在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

英創信息技術嵌入式Linux串口通訊的C++設計概述

英創信息技術 ? 來源:英創信息技術 ? 作者:英創信息技術 ? 2019-11-18 09:32 ? 次閱讀

嵌入式Linux主板EM9160提供了6個標準異步串口:ttyS1——ttyS6,其中ttyS4、ttyS5、ttyS6和GPIO的管腳復用,每個串口都有獨立的中斷模式,使得多個串口能夠同時實時進行數據收發。各個串口的驅動均已經包含在嵌入式Linux操作系統的內核中,EM9160在嵌入式Linux系統啟動完成時,各個串口已作為字符設備完成了注冊加載,用戶的應用程序可以以操作文件的方式對串口進行讀寫,從而實現數據收發的功能。

串口編程接口函數

在嵌入式Linux系統下,所有的設備文件都位于“/dev”目錄下,EM9160上6個串口所對應的設備名依次為“/dev/ttyS1”——“/dev/ttyS6”。

嵌入式Linux下操作設備的方式和操作文件的方式是一樣的:調用open( )打開設備文件,再調用read( )、write( )對串口進行數據讀寫操作。這里需要注意的是打開串口除了設置普通的讀寫之外,還需要設置O_NOCTTY和O_NDLEAY,以避免該串口成為一個控制終端,因為如果作為一個終端有可能會影響到用戶的進程。打開的方式如下:

sprintf( portname, ‘/dev/ttyS%d’, PortNo ); //PortNo為串口端口號,從1開始

m_fd = open( portname,O_RDWR | O_NOCTTY | O_NONBLOCK);

作為串口通訊還需要一些通訊參數的配置,包括波特率、數據位、停止位、校驗位等參數。在實際的操作中,主要是通過設置struct termios結構體的各個成員值來實現,一般會用到的函數包括:

tcgetattr( ) ;

tcflush( );

cfsetispeed( );

cfsetospeed( );

tcsetattr( );

其中各個函數的具體使用方法這里就不一一介紹了,用戶可以參考嵌入式Linux應用程序開發的相關書籍,也可參看Step2_SerialTest中Serial.cpp模塊中set_port( )函數代碼。

串口應用的C++設計

Step2 _SerialTest是一個支持異步串口數據通訊的示例,該例程采用了面向對象的C++編程,把串口數據通訊作為一個對象進行封裝,用戶調用該對象提供的接口函數即可方便地完成串口通訊的操作。

CSerial類介紹

利用上一小節中介紹的串口API函數,封裝了一個支持異步讀寫的串口類CSerial,CSerial類中提供了4個公共函數、一個串口數據接收線程以及數據接收用到的數據Buffer。

class CSerial

{

private:

//通訊線程標識符ID

pthread_t m_thread;

// 串口數據接收線程

static int ReceiveThreadFunc( void* lparam );

public:

CSerial();

virtual ~CSerial();

int m_fd; // 已打開的串口文件描述符

int m_DatLen;

char DatBuf[1500];

int m_ExitThreadFlag;

// 按照指定的串口參數打開串口,并創建串口接收線程

int OpenPort( int PortNo, int baudrate, char databits, char stopbits, char parity );

// 關閉串口并釋放相關資源

int ClosePort( );

// 向串口寫數據

int WritePort( char* Buf, int len );

// 接收串口數據處理函數

virtual int PackagePro( char* Buf, int len );

};

OpenPort函數用于根據輸入串口參數打開串口,并創建串口數據接收線程。在嵌入式Linux環境中是通過函數pthread_create( )創建線程,通過函數pthread_exit( )退出線程。嵌入式Linux線程屬性存在有非分離(缺省)和分離兩種,在非分離情況下,當一個線程結束時,它所占用的系統資源并沒有被釋放,也就是沒有真正的終止;只有調用pthread_join( )函數返回時,創建的線程才能釋放自己占有的資源。在分離屬性下,一個線程結束時立即釋放所占用的系統資源。基于這個原因,在我們提供的例程中通過相關函數將數據接收線程的屬性設置為分離屬性。如:

// 設置線程綁定屬性

res = pthread_attr_setscope( &attr, PTHREAD_SCOPE_SYSTEM );

// 設置線程分離屬性

res += pthread_attr_setdetachstate( &attr, THREAD_CREATE_DETACHED );

ReceiveThreadFunc函數是串口數據接收和處理的主要核心代碼,在該函數中調用select( ),阻塞等待串口數據的到來。對于接收到的數據處理也是在該函數中實現,在本例程中處理為簡單的數據回發,用戶可結合實際的應用修改此處代碼,修改PackagePro( )函數即可。流程如下:

int CSerial::ReceiveThreadFunc(void* lparam)

{

CSerial *pSer = (CSerial*)lparam;

//定義讀事件集合

fd_set fdRead;

int ret;

struct timeval aTime;

while( 1 )

{

//收到退出事件,結束線程

if( pSer-》m_ExitThreadFlag )

{

break;

}

FD_ZERO(&fdRead);

FD_SET(pSer-》m_fd,&fdRead);

aTime.tv_sec = 0;

aTime.tv_usec = 300000;

ret = select( pSer-》m_fd+1,&fdRead,NULL,NULL,&aTime );

if (ret 《 0 )

{

//關閉串口

pSer-》ClosePort( );

break;

}

if (ret 》 0)

{

//判斷是否讀事件

if (FD_ISSET(pSer-》m_fd,&fdRead))

{

//data available, so get it!

pSer-》m_DatLen = read( pSer-》m_fd, pSer-》DatBuf, 1500 );

// 對接收的數據進行處理,這里為簡單的數據回發

if( pSer-》m_DatLen 》 0 )

{

pSer-》PackagePro( pSer-》DatBuf, pSer-》m_DatLen);

}

// 處理完畢

}

}

}

printf( ‘ReceiveThreadFunc finished\n’);

pthread_exit( NULL );

return 0;

}

需要注意的是,select( )函數中的時間參數在嵌入式Linux中每次都需要重新賦值,否則會自動歸0。

CSerial類的實現代碼請參見Serial.CPP文件。

CSerial類的調用

CSerial類的具體使用也比較簡單,主要是對于類中定義的4個公共函數的調用,以下為 Step2_SerialTest.cpp中相關代碼。

class CSerial m_Serial;

int main( int argc,char* argv[] )

{

int i1;

int portno, baudRate;

char cmdline[256];

printf( ‘Step2_SerialTest V1.0\n’ );

// 解析命令行參數:串口號 波特率

if( argc 》 1 ) strcpy( cmdline, argv[1] );

else portno = 1;

if( argc 》 2 )

{

strcat( cmdline, ‘ ’ );

strcat( cmdline, argv[2] );

scanf( cmdline, ‘%d %d’, &portno, &baudRate );

}

else

{

baudRate = 115200;

}

printf( ‘port:%d baudrate:%d\n’, portno, baudRate);

//打開串口相應地啟動了串口數據接收線程

i1 = m_Serial.OpenPort( portno, baudRate, ‘8’, ‘1’, ‘N’);

if( i1《0 )

{

printf( ‘serial open fail\n’);

return -1;

}

//進入主循環,這里每隔1s輸出一個提示信息

for( i1=0; i1《10000;i1++)

{

sleep(1);

printf( ‘%d \n’, i1+1);

}

m_Serial.ClosePort( );

return 0;

}

從上面的代碼可以看出,程序的主循環只需要實現一些管理性的功能,在本例程中僅僅是每隔1s輸出一個提示信息,在實際的應用中,可以把一些定時查詢狀態的操作、看門狗的喂狗等操作放在主循環中,這樣充分利用了嵌入式Linux多任務的編程優勢,利用內核的任務調度機制,將各個應用功能模塊化,以便于程序的設計和管理。這里順便再提一下,在進行多個串口編程時,也可以利用本例程中的CSerial類為基類,根據應用需求派生多個CSerial派生類實例,每一個派生類只是重新實現虛函數PackagePro(…),這樣每個串口都具有一個獨立的串口數據處理線程,利用Linux內核的任務調度機制以實現多串口通訊功能。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • Linux
    +關注

    關注

    87

    文章

    11304

    瀏覽量

    209499
  • 嵌入式主板
    +關注

    關注

    7

    文章

    6085

    瀏覽量

    35336
收藏 人收藏

    評論

    相關推薦

    嵌入式主板的無線通訊解決方案

    WiFi模塊。ETA6210模塊繼續保持了PPP撥號模式,使得無論是Linux平臺的主板還是CE平臺的主板,都能方便的使用。  下表列出了當前嵌入式主板支持的無線模塊。模塊型號模
    發表于 03-24 14:00

    嵌入式linux培訓教程 嵌入式linux學習方法步驟

      嵌入式開發技術入門易,精通難。當然,如果相對于其他的開發技術來說,嵌入式學習門檻相對較高。但嵌入式如今的發展前景也要高于其他開發
    發表于 07-03 18:25

    嵌入式Linux C概述

    嵌入式Linux C概述嵌入式系統是現在最熱門的計算機應用領域之一,嵌入式
    發表于 12-15 08:32

    信息技術WinCE系統多串口擴展方案簡介

     異步串行通訊口(UART)是在工業自動化中應用最為廣泛的通訊接口之一,其接口形式包括RS232C、RS485、RS422。作為以網絡通訊為特色的
    的頭像 發表于 10-31 15:15 ?1681次閱讀
    <b class='flag-5'>英</b><b class='flag-5'>創</b><b class='flag-5'>信息技術</b>WinCE系統多<b class='flag-5'>串口</b>擴展方案簡介

    信息技術C#使用COM組件接口進行串口操作介紹

    嵌入式主板采用WinCE操作系統,很多客戶都選擇了界面友好、開發便利的C#語言(使用Visual Studio 2005.NET集成開發環境);在VS2005中,微軟提供了一個標準的串口
    的頭像 發表于 11-14 09:37 ?2328次閱讀
    <b class='flag-5'>英</b><b class='flag-5'>創</b><b class='flag-5'>信息技術</b><b class='flag-5'>C</b>#使用COM組件接口進行<b class='flag-5'>串口</b>操作介紹

    信息技術嵌入式系統設備驅動接口的C#編程

    ARM9系列嵌入式主板,均預裝了WinCE 5.0、WinCE 6.0操作系統,用戶可使用標準的C/C++
    的頭像 發表于 01-15 11:29 ?1300次閱讀

    信息技術嵌入式系統通訊線程的C#編程方法

    在使用ARM9系列嵌入式主板的COM口,CAN口,網口時,一般會使用到timer或線程來實現數據的接收。使用timer控件較為方便,通過InterVal值來設定調用間隔,但是靈活性不如線程。并且
    的頭像 發表于 01-15 11:25 ?1296次閱讀

    信息技術嵌入式Linux主板Qt串口應用程序簡介

    串口和其他設備一樣,在Linux系統中都是以設備文件的形式存在的,在公司提供的Linux主板配套光盤中,已經提供了基于
    的頭像 發表于 01-17 09:41 ?1825次閱讀
    <b class='flag-5'>英</b><b class='flag-5'>創</b><b class='flag-5'>信息技術</b><b class='flag-5'>嵌入式</b><b class='flag-5'>Linux</b>主板Qt<b class='flag-5'>串口</b>應用程序簡介

    信息技術Linux嵌入式工控板支持電容屏介紹

    隨著嵌入式應用對GUI圖形界面需求的增加,Qt在Linux嵌入式設備中的使用越來越廣泛,許多應用也都對人機交互界面有一定的要求。因此觸摸屏、鼠標等設備等支持也變得重要起來,
    的頭像 發表于 02-03 09:37 ?6551次閱讀
    <b class='flag-5'>英</b><b class='flag-5'>創</b><b class='flag-5'>信息技術</b><b class='flag-5'>Linux</b><b class='flag-5'>嵌入式</b>工控板支持電容屏介紹

    信息技術嵌入式主板的無線通訊解決方案

    無線通訊是指利用公共2G / 3G / 4G網絡進行的無線數據通訊,以及利用無線局域網WiFi的數據通訊。在當前嵌入式領域,無線通訊單元的主
    的頭像 發表于 02-05 11:03 ?1449次閱讀

    信息技術JAVA操作主板SPI接口簡介

    2017年9月,Linux的文件系統中移植了針對嵌入式Linux的JRE(Java Runtime Environment),能夠支持
    的頭像 發表于 02-06 11:09 ?1927次閱讀
    <b class='flag-5'>英</b><b class='flag-5'>創</b><b class='flag-5'>信息技術</b>JAVA操作<b class='flag-5'>英</b><b class='flag-5'>創</b>主板SPI接口簡介

    信息技術JAVA操作主板I2C接口簡介

    2017年9月,Linux的文件系統中移植了針對嵌入式Linux的JRE(Java Runtime Environment),能夠支持
    的頭像 發表于 02-06 11:06 ?1691次閱讀
    <b class='flag-5'>英</b><b class='flag-5'>創</b><b class='flag-5'>信息技術</b>JAVA操作<b class='flag-5'>英</b><b class='flag-5'>創</b>主板I2<b class='flag-5'>C</b>接口簡介

    信息技術Linux雙進程應用示例

    控制流程,應用程序采用C/C++語言來編寫。圖1表現了典型工控設備的組成關系。 典型工控設備框圖 工控設備的另一個特點是鑒于設備大多是24小時連續運行,且無人值守,所以基本的工控設備是無顯示的。
    的頭像 發表于 02-06 11:34 ?1129次閱讀
    <b class='flag-5'>英</b><b class='flag-5'>創</b><b class='flag-5'>信息技術</b><b class='flag-5'>Linux</b>雙進程應用示例

    信息技術嵌入式Linux主板多網口多路由方案

    主流的嵌入式主板均支持雙網絡接口,其中支持ISA擴展總線的主板型號,如:EM335x、ESM335x、ESM6802、ESM6800V等,還可以通過ISA總線外接ETA728模塊,再擴展兩路獨立
    的頭像 發表于 02-07 10:48 ?1814次閱讀
    <b class='flag-5'>英</b><b class='flag-5'>創</b><b class='flag-5'>信息技術</b><b class='flag-5'>嵌入式</b><b class='flag-5'>Linux</b>主板多網口多路由方案

    嵌入式Linux UART

    文章目錄前言串口連接串口測試C代碼微信公眾號前言這是前篇:嵌入式Linux i.MX開發板嵌入式
    發表于 11-01 16:26 ?8次下載
    <b class='flag-5'>嵌入式</b><b class='flag-5'>Linux</b> UART
    主站蜘蛛池模板: 国产在线视频网站| 黄色大片免费观看| 国产精品你懂的| 天堂8资源8在线| 亚州一级毛片在线| 国产精品夜色一区二区三区| 日韩第二页| 天天综合色天天综合色sb| 丁香激情小说| 亚洲美女爱爱| 黄色三级视频在线观看| 久操视频在线免费观看| 91大神在线看| 国产aaaaa一级毛片| 久久久久久9| 午夜神马福利免费官方| 国产午夜毛片v一区二区三区 | 男女性接交无遮挡免费看视频| 日本护士撒尿| 操碰视频在线| 国产农村乱色xxxx| 欧美一区二区三区成人看不卡| 天天涩综合| 67pao强力打造高清免费| 日本三级成人午夜视频网| 成人精品一区二区不卡视频 | 久久天天躁狠狠躁夜夜爽| 黄色伊人网| 亚洲特级aaaaaa毛片| ww欧洲ww在线视频看| 丁香六月激情综合| 欧美潘金莲一级风流片a级| 亚洲午夜精品一区二区| 成人黄色免费看| 最新毛片网| 久久精品高清视频| 99xxxx开心| 欧美色图888| 天天射天天色天天干| 字幕网中文aⅴ资源站| www.黄视频|