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