LabwindowsCVI 串列埠程式設計及事例

2021-09-10 21:39:25 字數 3877 閱讀 9874

串列埠是一種常見的通訊匯流排技術,其支援全雙工模式,且只支援一對一的訪問模式,大部分裝置都支援串列埠通訊,可通過串列埠控制裝置或採集資料。下面將介紹labwindowscvi對串列埠的支援。

opencomconfig:

opencomconfig用於開啟並配置com裝置,其函式原型如下所示:

int opencomconfig (int portnumber, char devicename, long baudrate, int parity, int databits, int stopbits, int inputqueuesize, int outputqueuesize);

其中portnumber為com口號,devicename為裝置名,baudrate為波特率,parity為奇偶校驗,databits為資料位,stopbits位停止位,inputqueuesize為輸入佇列的大小,outputqueuesize為輸出佇列的大小。

closecom:

closecom用於關閉com口,其函式原型如下所示:

int closecom (int portnumber);

其中portnumber為開啟的com口。

comrd:

comrd用於讀取com口的接收資料,其函式原型如下所示:

int comrd (int portnumber, char buffer, size_t count);

其中portnumber為開啟的com口,buffer為讀取的資料快取,count為要讀取的資料的大小。注意當count的值大於輸入佇列資料快取的大小,該函式將阻塞一段時間直到超時完成或輸入佇列裡的資料大於count。

comwrt:

comwrt用於往com口傳送資料,其函式原型如下所示:

int comwrt (int portnumber, char buffer, size_t count);

其中portnumber為開啟的com口,buffer為要傳送的資料,count為要傳送的資料大小。

flushinq:

flushinq用於清除com口輸入佇列的快取資料,其函式原型如下所示:

int flushinq (int portnumber);

其中portnumber口為開啟的com口。

flushoutq:

flushoutq用於清除com口輸出佇列的快取資料,其函式原型如下所示:

int flushoutq (int portnumber);

其中portnumber口為開啟的com口。

getinqlen:

getinqlen用於得到com口的輸入佇列資料快取的大小,其函式原型如下所示:

int getinqlen (int portnumber);

其中portnumber口為開啟的com口。

getoutqlen:

getoutqlen用於得到com口的輸出佇列資料快取的大小,其函式原型如下所示:

int getoutqlen (int portnumber);

其中portnumber口為開啟的com口。

returnrs232err:

returnrs232err用於得到串列埠的錯誤碼,其函式原型如下所示:

int returnrs232err (void);

getrs232errorstring

getrs232errorstring用於得到串列埠錯誤碼的字串描述,其函式原型如下所示:

char *getrs232errorstring (int errornumber);

其中errornumber為returnrs232err得到的錯誤碼。

串列埠資料封包:

為什麼要對串列埠資料進行封包呢?1、識別資料報的開頭和結尾;2、加強資料報的校驗能力。一般封包協議如下所示:

包頭(2byte)

0xaa55

長度(1 byte)

0~255

資料(0~255 byte)

校驗(1 byte)

其中校驗一般採用異或的方式,長度為包頭到資料。

專案實踐:

新建乙個labwindowscvi工程,建立乙個後台工作執行緒,該執行緒執行com資料的傳送和接收,其**如下所示:

#include

#include

#include

#include

#include

#include "comtest.h"

static int panelhandle;

int packetcomdata(char *data,uint8_t datalen);

void comdecodeprocess(uint8_t *data,int datalen);

int createbackgroundthread(void)

else

}return ret;

}int quitbackgroundthread(void)

int portnum = 0;

int baudrate = 0;

int parity = 0;

int databits = 0;

int stopbits = 0;

int portopenflag = 0;

int senddatalen = 0;

char senddata[512];

volatile int senddataflag = 0;

int senddatacnt = 0;

int receivedatacnt = 0;

char receivedata[513];

volatile int packetcomdataflag = 0; }}

}return 0;

}int main (int argc, char *ar**)

typedef enum

comdecodestate;

comdecodestate comdecodestate = com_get_header1;

uint8_t payloadlen = 0;

uint8_t payloadlencnt = 0;

char payload[512];

uint8_t comdecodecheckcal(char *data,int datalen)

else

}實踐效果:

找乙個usb轉ttl的轉接板,插入電腦的usb口,並安裝該轉接板的驅動,然後用杜邦線將txd和rxd連線起來,實現自發自收的功能。開啟電腦的裝置管理器,檢視該轉接板的串口號,從圖中可以看出該串口號為 4,如下圖所示:

執行串列埠測試工程,配置串口號為4,然後開啟串列埠,往傳送文字框中輸入要傳送的資料hello,然後單擊傳送,可以看到在接收文字框中可以看到顯示hello,如下圖所示:

上面是純粹的串列埠傳送和顯示測試,沒有進行串列埠資料封包,單擊介面上的封包單選按鈕,串列埠資料將被封包和解包,如下圖所示:

LabWindows CVI對話方塊

函式原型 int messagepopup char title,char message title 對話方塊標題 例 this is a message popup message 對話方塊資訊 例 message text goes here 返回值 負代表錯誤 返回值 1 yes 0 no ...

LabWindows CVI第一章 基本規則

一 include 標頭檔案,號是預處理指令,standard input output header的縮寫。void main 主函式 printf hello n print format的縮寫,前加tab鍵空出4個格。return 0 n 換行,t 空字元,f 實數,一般保留六位有效數字,2f...

linux debug串列埠改為普通串列埠

origin 和我們的需求一樣,我們是如果使用者想把串列埠作為console的話,那麼在系統啟動的時候,輸入回車來開啟console,否則就作為普通的串列埠用。1,在核心驅動裡,不要將串列埠初始化為console,如我的 uclinux l200v40 linux 2.4.x drivers cha...