返學(xué)費(fèi)網(wǎng) > 培訓(xùn)機(jī)構(gòu) > 全國IT培訓(xùn)中心
想了解java串口編程教程嗎?想了解C# SerialPort連接串口,讀寫串口數(shù)據(jù),C#串口介紹及串口通信程序設(shè)計實(shí)現(xiàn)(附程序分享),Linux下串口編程基礎(chǔ),串口編程 - 串口簡介?? 嗎?......本文帶你一探究竟。
一、起始最近在公司做上位機(jī),上位機(jī)要求是能夠讀取一款支持串口通信的傳感器并且把傳感器的數(shù)據(jù)用圖表顯示出來,且上位機(jī)能對傳感器發(fā)送指令,需求有涉及到串口通信和繪制圖表。那么首先要解決的問題就是能夠讓電腦上的程序進(jìn)行串口通信,有串口通信的編程語言有很多,C++,C#,JAVA,Python等語言都是支持串口通信的。我選擇了使用C#,因為上位機(jī)主要是在Windows操作系統(tǒng)上運(yùn)行,而C#對于winodws桌面應(yīng)用的開發(fā)支持是比較方便的,功能也比較強(qiáng)大,尤其是WPF程序,做出來的UI頁面比較好看那么本篇內(nèi)容就介紹c#程序怎么實(shí)現(xiàn)串口通信二、工具準(zhǔn)備開發(fā)工具:Visual Studio 2021 Community 開發(fā)工具下載:免費(fèi)的 IDE 和開發(fā)人員工具 | Visual Studio Community維特智能姿態(tài)角度傳感器JY901模塊*1USB-TLL模塊*1、杜邦線*1三、新建項目1.新建項目,選擇WPF應(yīng)用程序,你可能會發(fā)現(xiàn)兩個 WPF 桌面模板,一個用于 .NET Framework,另一個用于 .NET Core。 .NET Core 模板在 Visual Studio 2021 16.3 及更高版本中可用。 你可以在本教程中使用任何一個,但建議使用 .NET Core 進(jìn)行新的開發(fā)。2.在下一屏幕中指定“項目名稱”和選擇“項目路徑”,然后點(diǎn)擊“創(chuàng)建”四、添加串口通信引用1.右擊項目解決方案“管理NuGet程序包”,搜索“Ports”關(guān)鍵字,添加System.IO.Ports引用。System.IO.Ports包是.Net 2.0以來集成的免費(fèi)的串口通信包,五、建立串口通信工具類創(chuàng)建工具類,為了后面能夠方便的操作串口我們先實(shí)現(xiàn)一個串口操作的工具類,串口通信中用到最多的操作就是“搜索串口”,”打開/關(guān)閉串口“,”接收數(shù)據(jù)“,“發(fā)送數(shù)據(jù)”,我們可以先實(shí)現(xiàn)以上操作的方法。搜索串口實(shí)現(xiàn),搜索串口可以直接調(diào)用類的方法,該方法會返回一個串口名稱的string數(shù)組。打開關(guān)閉串口實(shí)現(xiàn),這里傳入“串口名稱”和“波特率”參數(shù)打開串口,如果有需要其他參數(shù)可以修改方法參數(shù)。打開串口后把做為接收事件的委托。接收串口數(shù)據(jù)的委托方法實(shí)現(xiàn),sender對象為串口對象,接收數(shù)據(jù)后直接向控制臺打印數(shù)據(jù)發(fā)送數(shù)據(jù)實(shí)現(xiàn),檢查串口是否打開,然后向串口發(fā)送數(shù)據(jù)并且打印到控制臺,這樣一個簡單的串口通信工具類就實(shí)現(xiàn)了六、工具類完整代碼public class { public static string[] () { return .(); } public static = null; public static (string comName,int baud) { //串口未打開 if ( == null|| !.IsOpen) { = new (); //串口名稱 .PortName = comName; //波特率 .BaudRate = baud; //數(shù)據(jù)位 .DataBits = 8; //停止位 .StopBits = StopBits.One; //校驗位 .Parity = Parity.None; //打開串口 .Open(); //串口數(shù)據(jù)接收事件實(shí)現(xiàn) . += new (); return ; } //串口已經(jīng)打開 else { .Close(); return ; } } public static void (object sender, e) { _ = ()sender; int _ = _.; byte[] recvData = new byte[_]; _.Read(recvData, 0, _); //向控制臺打印數(shù)據(jù) Debug.WriteLine("收到數(shù)據(jù):"+ recvData); } public static bool SendData(byte[] data) { if ( != null && .IsOpen) { .Write(data, 0, data.Length); Debug.WriteLine("發(fā)送數(shù)據(jù):" + data); return true; } else { return false; } } } 七、工具類收發(fā)數(shù)據(jù)演示JY901連接我的電腦是COM3測試方法,在創(chuàng)建方法,方法先搜索一遍串口,打印所有串口的名稱;然后打開COM3,向COM3發(fā)送一條指令調(diào)試輸出結(jié)果COM3 發(fā)送數(shù)據(jù):System.Byte[] 收到數(shù)據(jù):System.Byte[] 收到數(shù)據(jù):System.Byte[] 收到數(shù)據(jù):System.Byte[] 收到數(shù)據(jù):System.Byte[] 收到數(shù)據(jù):System.Byte[]調(diào)試后發(fā)現(xiàn)輸出的數(shù)據(jù)是一個Byte數(shù)組,是的在串口開發(fā)中收到的數(shù)據(jù)都是byte形式的,在串口開發(fā)過程中經(jīng)常會遇到byte數(shù)據(jù)和二進(jìn)制、十進(jìn)制、十六進(jìn)制的數(shù)據(jù)。下一篇“C#十六進(jìn)制、十進(jìn)制、二進(jìn)制、字符串?dāng)?shù)據(jù)互轉(zhuǎn)”將詳細(xì)介紹串口開發(fā)中用到的數(shù)據(jù)裝換八、結(jié)語再為大家介紹一個優(yōu)秀的C#開源串口助手項目碼云OSDA開源串口助手項目地址:Leven/OSDA感謝閱讀本篇“C# 連接串口,讀取串口數(shù)據(jù)”,本篇到此結(jié)束,下一篇“C#十六進(jìn)制、十進(jìn)制、二進(jìn)制、字符串?dāng)?shù)據(jù)互轉(zhuǎn)”
一、簡介串行接口簡稱串口(Serial Interface),也稱串行通信接口或串行通訊接口(通常指COM接口),是采用串行通信方式的擴(kuò)展接口。串行接口 是指數(shù)據(jù)一位一位地順序傳送。其特點(diǎn)是通信線路簡單,只要一對傳輸線就可以實(shí)現(xiàn)雙向通信(可以直接利用電話線作為傳輸線),從而大大降低了成本,特別適用于遠(yuǎn)距離通信,但傳送速度較慢。9位針腳功能對應(yīng)如下: 載波檢測(DCD) 接受數(shù)據(jù)(RXD) 發(fā)出數(shù)據(jù)(TXD) 數(shù)據(jù)終端準(zhǔn)備好(DTR) 信號地線(SG) 數(shù)據(jù)準(zhǔn)備好(DSR) 請求發(fā)送(RTS) 清除發(fā)送(CTS) 振鈴指示(RI)二、串口應(yīng)用工業(yè)領(lǐng)域使用較多,比如:數(shù)據(jù)采集,設(shè)備控制等等,好多都是用串口通信來實(shí)現(xiàn)!比如電表的通信接口就是串口通信。上述9針腳接口中,我們一般只接出RXD TXD兩針,外加GND,即可實(shí)現(xiàn)兩臺設(shè)備之間的串口通信。三、串口通信協(xié)議空閑位:UART協(xié)議規(guī)定,當(dāng)總線處于空閑狀態(tài)時信號線的狀態(tài)為‘1’即高電平,表示當(dāng)前線路上沒有數(shù)據(jù)傳輸。起始位:每開始一次通信時發(fā)送方先發(fā)出一個邏輯”0”的信號(低電平),表示傳輸字符的開始。因為總線空閑時為高電平所以開始一次通信時先發(fā)送一個明顯區(qū)別于空閑狀態(tài)的信號即低電平。數(shù)據(jù)位:起始位之后就是我們所要傳輸?shù)臄?shù)據(jù),數(shù)據(jù)位可以是5、6、7、8,9位等,構(gòu)成一個字符(一般都是8位)。如ASCII碼(7位),擴(kuò)展BCD碼(8位)。先發(fā)送最低位,最后發(fā)送最高位,使用低電平表示‘0’高電平表示‘1’完成數(shù)據(jù)位的傳輸。奇偶校驗位:數(shù)據(jù)位加上這一位后,使得“1”的位數(shù)應(yīng)為偶數(shù)(偶校驗)或奇數(shù)(奇校驗),以此來校驗數(shù)據(jù)傳送的正確性。校驗位其實(shí)是調(diào)整個數(shù),串口校驗分幾種方式:1、無校驗(no parity)。2、奇校驗(odd parity):如果數(shù)據(jù)位中“1”的數(shù)目是偶數(shù),則校驗位為“1”,如果“1”的數(shù)目是奇數(shù),校驗位為“0”。3、偶校驗(even parity):如果數(shù)據(jù)為中“1”的數(shù)目是偶數(shù),則校驗位為“0”,如果為奇數(shù),校驗位為“1”。4、mark parity:校驗位始終為1(不常用)。5、parity:校驗位始終為0(不常用)。停止位:它是一個字符數(shù)據(jù)的結(jié)束標(biāo)志??梢允?位、1.5位、2位的高電平。 由于數(shù)據(jù)是在傳輸線上定時的,并且每一個設(shè)備有其自己的時鐘,很可能在通信中兩臺設(shè)備之間出現(xiàn)了小小的不同步。因此停止位不僅僅是表示傳輸?shù)慕Y(jié)束,并且提供計算機(jī)校正時鐘的機(jī)會。停止位個數(shù)越多,數(shù)據(jù)傳輸越穩(wěn)定,但是數(shù)據(jù)傳輸速度也越慢。波特率:數(shù)據(jù)傳送速率用波特率來表示,單位bps(bits per second),即每秒鐘傳送的二進(jìn)制位數(shù)。例如數(shù)據(jù)傳送速率為120字符/秒,而每一個字符為10位(1個起始位,7個數(shù)據(jù)位,1個校驗位,1個結(jié)束位),則其傳送的波特率為10×120=1200字符/秒=1200波特。常見的波特率9600bps、115200bps等等,其他標(biāo)準(zhǔn)的波特率是1200,2400,4800,19200,38400,57600。舉個例子,如果串口波特率設(shè)置為9600bps,那么傳輸一個比特需要的時間是1/9600≈104.2us。四、C#程序設(shè)計首先在VS中建立Windows窗口程序;串口通信程序中首先設(shè)置串口相關(guān)必要信息,包括:串口號,波特率,數(shù)據(jù)位,停止位,校驗位等,以及接受與發(fā)送的數(shù)據(jù)量Rx與Tx?;具壿嬍牵捍蜷_軟件后,首先獲取現(xiàn)在存在的串口號,添加至串口號選擇欄的下拉項目中: rivate void comboBox_Port_Update() { keyCom = Registry..("Hardware\\DeviceMap\\"); //需要調(diào)用Win32 if(keyCom != null) { string[] sSubKeys = keyCom.(); foreach(string sName in sSubKeys ) { string sValue = (string)keyCom.GetValue(sName); comboBox1.Items.Add(sValue ); } } } 3. 添加發(fā)送和接收項目,并且設(shè)置發(fā)送按鈕與清除接收消息框的清除按鈕:4. 測試各項功能,以及調(diào)試bug。需要考慮這些情況:(1)串口還沒打開就發(fā)送數(shù)據(jù),需要彈出警告框提示串口還未打開:(2)發(fā)送欄的參數(shù)還沒設(shè)置完整,就點(diǎn)擊發(fā)送按鈕:還有一些設(shè)計交互邏輯,在慢慢測試中就會發(fā)現(xiàn),在此不再一一列舉。有需要程序源代碼的同學(xué)私信我,或者不介意的話可以加微信storm22交流。C#串口介紹及串口通信程序設(shè)計實(shí)現(xiàn)(附程序分享)
Linux下串口編程基礎(chǔ)一、串口概述串行口是計算機(jī)一種常用的接口,具有連接線少,通訊簡單,得到廣泛的使用。常用的串口是 RS-232-C 接口(又稱 EIA RS-232-C)它是在 1970 年由美國電子工業(yè)協(xié)會(EIA)聯(lián)合貝爾系統(tǒng)、 調(diào)制解調(diào)器廠家及計算機(jī)終端生產(chǎn)廠家共同制定的用于串行通訊的標(biāo)準(zhǔn)。它的全名是"數(shù)據(jù)終端設(shè)備(DTE)和數(shù)據(jù)通訊設(shè)備(DCE)之間串行二進(jìn)制數(shù)據(jù)交換接口技術(shù)標(biāo)準(zhǔn)"該標(biāo)準(zhǔn)規(guī)定采用一個 25 個腳的 DB25 連接器,對連接器的每個引腳的信號內(nèi)容加以規(guī)定,還對各種信號的電平加以規(guī)定。傳輸距離在碼元畸變小于 4% 的情況下,傳輸電纜長度應(yīng)為 50 英尺。二、串口編程1. 串口需要的頭文件 1: #include <stdio.h> /*標(biāo)準(zhǔn)輸入輸出定義*/ 2: #include <stdlib.h> /*標(biāo)準(zhǔn)函數(shù)庫定義*/ 3: #include <unistd.h> /*Unix 標(biāo)準(zhǔn)函數(shù)定義*/ 4: #include <sys/types.h> 5: #include <sys/stat.h> 6: #include <fcntl.h> /*文件控制定義*/ 7: #include <termios.h> /*POSIX 終端控制定義*/ 8: #include <errno.h> /*錯誤號定義*/2. 打開關(guān)閉串口對于串口設(shè)備文件的操作與其他文件操作基本相同??梢允褂孟到y(tǒng)調(diào)用open(), close()打開或關(guān)閉串口。在Linux下串口文件是在/dev下的,例如串口一為/dev/ttyS0,串口二為/dev/ttyS1。open(),close()系統(tǒng)調(diào)用的原型 1: #include <fcntl.h> 2: #include <sys/types.h> 3: #include <sys/stat.h> 4: int open(const char *path, int oflags); 5: int open(const char *path, int oflags, mode_t mode); 6: #include <unistd.h> 7: int close(int fildes); 8: 實(shí)例:打開串口ttyS0。 9: int fd; 10: /*以讀寫方式打開串口*/ 11: fd = open( "/dev/ttyS0", O_RDWR); 12: if (-1 == fd){ 13: /* 不能打開串口一*/ 14: perror("open serial port error"); 15: }3. 設(shè)置串口設(shè)置串口包括波特率設(shè)置、校驗位、停止位設(shè)置。在串口設(shè)置中主要是設(shè)置struct termios結(jié)構(gòu)體成員的值。struct termios結(jié)構(gòu)如下 1: #include <termios.h> 2: struct termio 3: { 4: unsigned short c_iflag; /* input options輸入模式標(biāo)志 */ 5: unsigned short c_oflag; /* output options輸出模式標(biāo)志 */ 6: unsigned short c_cflag; /* control options控制模式標(biāo)志*/ 7: unsigned short c_lflag; /* local mode flags */ 8: unsigned char c_line; /* line */ 9: unsigned char c_cc[NCC]; /* control */ 10: };l 波特率的設(shè)置波特率:每秒鐘傳送的二進(jìn)制位數(shù),用 b / s 表示(b表示bit)。設(shè)置波特率需要對c_cflag進(jìn)行操作。c_cflag支持的波特率設(shè)置項如下: mask for baud rateB00 baud (drop DTR)B5050 baudB7575 .5 ,600 ,800 ,200 baud設(shè)置c_cflag需要激活兩個選項,CLOCAL和CREAD,它們分別為本地連接和串口接收使能。波特率的設(shè)置并不能直接對c_cflag進(jìn)行賦值操作,Linux提供系統(tǒng)調(diào)用()和()來設(shè)置波特率。原型: 1: int (struct termios *termptr, speed_t speed); 2: int (struct termios *termptr, speed_t speed); 參數(shù)中termptr為指向termios結(jié)構(gòu)體的指針,speed為要設(shè)置的波特率。如果成功返回0,否則返回-1。在波特率設(shè)置完成后調(diào)用tcsetattr()來激活設(shè)置。原型: 1: #include <termios.h> 2: int tcsetattr(int fd, int actions, const struct termios *termios_p);參數(shù)中actions控制如何對串口設(shè)置進(jìn)行改變,可選項為:TCSANOW: 立即對值進(jìn)行修改。TCSADRAIN: 在當(dāng)前輸出完成后再對值進(jìn)行修改。TCSAFLUSH: 在當(dāng)前輸出完成后再對值進(jìn)行修改,但還要丟棄當(dāng)前的可用輸入數(shù)據(jù)和尚未從 read 調(diào)用的返回值。實(shí)例:設(shè)置波特率 1: struct termios options; 2: /* 3: * 得到當(dāng)前串口設(shè)置,保存在options中 4: */ 5: tcgetattr(fd, &options); 6: /* 7: * 設(shè)置波特率為19200 8: */ 9: (&options, B19200); 10: (&options, B19200); 11: /* 12: * 本地連接和接收使能 13: */ 14: options.c_cflag |= (CLOCAL | CREAD); 15: /* 16: * 應(yīng)用設(shè)置(立即應(yīng)用) 17: */ 18: tcsetattr(fd, TCSANOW, &options);l 數(shù)據(jù)位、校驗位與停止位的設(shè)置對于數(shù)據(jù)位的設(shè)置沒有專用的系統(tǒng)調(diào)用,你可以使用位掩碼的操作來設(shè)置數(shù)據(jù)位。實(shí)例:選擇8位數(shù)據(jù)位 1: options.c_cflag &= ~CSIZE; /* 清除數(shù)據(jù)位掩碼Mask the character size bits */ 2: options.c_cflag |= CS8; /* 選擇8位數(shù)據(jù)位Select 8 data bits */校驗位需要設(shè)置c_cflag和c_iflag。首先要激活c_cflag的校驗位使能標(biāo)志PARENB(parity enable),選擇是否使用偶校驗PARODD,然后激活c_iflag中奇偶校驗使能位(INPACK enable parity check | ISTRIP strip parity bits)。實(shí)例:選擇奇校驗 1: options.c_cflag |= PARENB; 2: options.c_cflag |= PARODD; 3: options.c_iflag |= (INPACK|ISTRIP);選擇偶校驗 1: options.c_cflag |= PARENB; 2: options.c_cflag &= ~PARODD; 3: options.c_iflag |= (INPACK|ISTRIP);停止位的設(shè)置是通過激活c_cflag中的CSTOPB實(shí)現(xiàn)的,停止位為1,清除CSTOPB,停止位為0,激活CSTOPB。實(shí)例: 設(shè)置停止位為1。 1: options.c_cflag &= ~CSTOPB;l 最少字符和等待時間的設(shè)置設(shè)置c_cc成員數(shù)組中的VTIME和VMIN分別設(shè)置等待時間和最少字符。VTIME和VMIN的值決定串口的等待時間和接收的最少字符,在此之前,會堵塞串口直到到達(dá)設(shè)置的時間或者字符個數(shù)。實(shí)例:將最少字符和等待時間設(shè)置為0 1: options.c_cc[VTIME] = 0; 2: options.c_cc[VMIN] = 0;4. 讀寫串口讀寫串口和普通的文件操作相同,分別使用read()和write()。原型: 1: #include <unistd.h> 2: size_t read(int fields, void *buf, size_t nbytes); 3: size_t write(int fildes, const void *buf, size_t nbytes);實(shí)例:寫串口 1: char buffer[] = “hello world”; 2: int length = 11; 3: int nByte; 4: nByte = write(fd, buffer, length);嵌入式物聯(lián)網(wǎng)資料分享交流群:332650978 入群有全套學(xué)習(xí)視頻資料電子書免費(fèi)贈送!參考資料:嵌入式開發(fā)直播課 - 走進(jìn)linux底層驅(qū)動Linux 基礎(chǔ)_JAVA嵌入式開發(fā)直播課 - STM32 USART串口的應(yīng)用
串口編程 - 串口簡介前言串行接口(Serial port),也稱串行接口或串行端口,串行通信接口,COM接口,簡稱串口。主要用于串行式逐位數(shù)據(jù)傳輸。串口通信(Serial ),是一種非常常見的設(shè)備間的通信方式。串口通信協(xié)議是指雙方約定一致的數(shù)據(jù)包格式規(guī)范(包含起始位、數(shù)據(jù)、校驗位及停止位)。1.串口常見的電氣標(biāo)準(zhǔn)和協(xié)議1.1 RS-232CRS-232C標(biāo)準(zhǔn)串口,是目前最常用的一種串行通信接口機(jī)械特性RS-232C采用的接口是9針或25針的D型插頭,常用的一般是9針插頭。DE-9 Male(Pin Side) DE-9 Female (Pin Side) ------------- ------------- \ 1 2 3 4 5 / \ 5 4 3 2 1 / \ 6 7 8 9 / \ 9 8 7 6 / --------- ---------9針插頭管腳1 數(shù)據(jù)載波檢測(DCD) 2 接受數(shù)據(jù)(RD、RXD) 3 發(fā)送數(shù)據(jù)(TD、TXD) 4 數(shù)據(jù)終端準(zhǔn)備(DTR) 5 公共接地 6 數(shù)據(jù)準(zhǔn)備好(DSR) 7 請求發(fā)送(RTS) 8 清除發(fā)送(CTS) 9 振鈴指示(RI)電氣特性邏輯電平:邏輯1: -3~-15V;邏輯0: 3~15V 數(shù)據(jù)最高傳輸速率:19200bps 最遠(yuǎn)通信距離:15m1.2 RS-422RS-232存在距離短、速率低的問題,RS-422提升了這兩方面,最大傳輸距離1200m,最大傳輸速度10Mb/s機(jī)械特性一般是9針插頭D型插頭電氣特性邏輯電平:邏輯1: 兩線間的電壓差+2V~+6V 邏輯0: 兩線間的電壓差-6V~-2V 數(shù)據(jù)最高傳輸速率:10Mbps 最遠(yuǎn)通信距離:1200m1.3 RS-485在RS-422基礎(chǔ)上,RS-485增加了多點(diǎn)、雙向通信能力,具備聯(lián)網(wǎng)功能。機(jī)械特性一般是9針插頭D型插頭電氣特性邏輯電平:邏輯1: 兩線間的電壓差+2V~+6V 邏輯0: 兩線間的電壓差-6V~-2V 數(shù)據(jù)最高傳輸速率:10Mbps 最遠(yuǎn)通信距離:1200m2. 串口數(shù)據(jù)包的組成串口數(shù)據(jù)包由起始位、數(shù)據(jù)、校驗位及停止位組成。最常見的串口數(shù)據(jù)包配置為9600 8N1(9600波特率,8位數(shù)據(jù)位,無校驗,1位停止位)。例如傳輸字符0(ASCII為48,二進(jìn)制110000)01100001解釋0(起始位) 110000(8位數(shù)據(jù)位) 1(1位停止位)2.1 起始位一個邏輯0(低電平)的數(shù)據(jù)位表示開始2.2 數(shù)據(jù)位起始位后的就是數(shù)據(jù)位,數(shù)據(jù)位的長度一般為5、6、7、8。2.3 校驗位校驗位用于校驗數(shù)據(jù)是否正確。一般分為:0 - No Parity 無校驗 1 - Odd Parity 奇校驗 2 - Even Parity 偶校驗 3 - Mark Parity 1校驗 4 - Space Parity 0校驗2.4 停止位數(shù)據(jù)傳輸結(jié)束的標(biāo)志,一般由 1、1.5、2 個邏輯1(高電平)的數(shù)據(jù)位表示Reference:
上述文章了解到關(guān)于C# SerialPort連接串口,讀寫串口數(shù)據(jù),C#串口介紹及串口通信程序設(shè)計實(shí)現(xiàn)(附程序分享),Linux下串口編程基礎(chǔ),串口編程 - 串口簡介?? ,讓我們對java串口編程教程 有一個直觀的認(rèn)知。我們發(fā)現(xiàn),作為一個優(yōu)秀的Java程序員是多么的自豪。