① 單片機串口通訊協議程序如何寫 最好舉個例子 萬分感謝
單片機串口通訊協議,這要看單片機是與什麼通信,是電腦嗎,還是其他什麼設備,如果是買來的什麼設備,那一定要按那設備的通信協議來寫程序啦,不然話,是不能通信的。如果是電腦就好辦了,因電腦端可以寫一個軟體來完成收/發,那具體的單片機與電腦的通信協議就可以自己來定義啦,其中包括確定波特率,數據位數,即是8位,還是9位,9位的話,要加校驗位,比較麻煩,8位比較方便,還有就是結束位是1位。這些是基本的參數,主要是定義通信代碼啦,用什麼代碼表示什麼功能,上位機與下位機如何聯系,即怎麼應答,一條報文有幾個位元組,用不用校驗和,等等,這些事宜都是可以自己定義的。
② 51單片機如何進行串口通信,並制定通信協議.
連線就是 交叉連接 A的TX到B的RX A的RX到B的TX,還有一根地線 串口線就這三根就夠用了 然後就是初始化A和B的串口,設置波特率,工作模式,開中斷等等 A和B的通信,你先調試一台機器,比如A,和電腦連接,用串口調試助手(網上找)查看A的收發數據是否正常,然後A和B聯調 串口通信距離不遠一般不會出錯,波特率較低,除了奇偶校驗,你可以指定一個簡單的通信協議,來驗證是否數據正常 這類程序網上很多,你不清楚就搜索51串口程序,出來一大堆,找個有注釋的看看,調試一下試一試 祝你順利 在網上找了一下,這兩個你參考一下,注釋很詳細 串口發送
③ 51單片機C語言怎麼寫Modbus通信程序
Modbus通信程序就是串口,只是比串口復雜點而已
④ 51單片機通信協議的問題
說實話,樓主的話也讓我琢磨了半天。
首先,沒怎麼聽說過「MSB」,不過看有關通信協議的解釋以及程序。
「通信協議: 第1位元組,MSB為1,為第1位元組標志,第2位元組,MSB為0,為非第一位元組標志,其餘類推……,最後一個位元組為前幾個位元組後7位的異或校驗和」
可見所謂MSB就是位元組的最高位。「最後一個位元組為前幾個位元組後7位的異或校驗和」也就是說他把每個位元組的最高位當作首位元組的標志用了,因而每個位元組所能表示的數只有0-127(7個bit),至於最高位的那一個bit,只和是否為首位元組有關,只有首位元組的最高位為「1」其他的位元組最高位都為「0」。
再來看程序,其實程序中重點要看的只有一個子函數
//串口接收中斷函數
void serial () interrupt 4 using 3 //串口中斷號為4,後面的using為寄存器組切換
{
if (RI) //判斷是否是接收中斷
{
unsigned char ch; //在這里定義了一個 字元變數 「ch」
RI = 0 ; //清標志位
ch=SBUF; //這里把接收到的數據從串口緩存讀到了變數ch里
if (ch> 127 ) //注意這里,ch>127的話其最高位必須是1才可以。也就是說,只有首位元組才並且必然大於127。換句話說在這里判斷了首位元組
{ //是首位元組的話。。。
count3= 0 ; //給count3賦初值,這個count3就是用來計數接收到的字元的個數的。
inbuf1[count3]=ch; //把接收到的數據放到字元串inbuf1[]中,這inbuf1[]他定義的是全局變數,因而可以傳回去。(他好像忘了去掉最高位的首位元組標志了)
checksum= ch- 128 ; //這就是計算所謂的校驗和了吧,先把首位放進去,之所以減了個128就是要把最高位的標志減掉,只計算後七位的校驗和。
}
else //不是首位元組的話。。。
{
count3++; //接收計數自增
inbuf1[count3]=ch; //隨著每次count3的自增,依次把接收到的數據放到字元串inbuf1[]中
checksum ^= ch; //依次按位異或,也就是說每收到一個位元組都拿來異或一下。
if ( (count3==(INBUF_LEN- 1 )) && (!checksum) ) //邏輯表達式有點長啊,最外層是與,每個元素都為真才可以,前面count3==(INBUF_LEN- 1 )也就是說接收到了最後一個字元(他定義的INBUF_LEN =4,count3從0加到3,一共接收了四個字元),後面!checksum當依次按位異或的結果歸0時才為真。
{
read_flag= 1 ; //如果串口接收的數據達到INBUF_LEN個,且校驗沒錯,
//就置位取數標志
}
}
}
}
這下明白點了吧。至於「95 10 20 25」原程序已經寫了是16進制,而且一樓解釋的也很明白了,再此不再多說,
至於發送12345 或 67890 的計算,因為要加上協議因此有點麻煩。
先看他的例子吧95 10 20 25 這是四個位元組的16進制數,全都轉成二進制的數字看的清楚。
95——10010101
10——00010000
20——00100000
25——00100101
看到了吧,只有第一個0x95的最高位是1。其他的幾個位元組最高位都是0。
至於校驗和,你查查每一縱列的1是不是都是偶數個(當然除了第一列)?偶數個1異或就是0。
當然你要發12345還要改下程序,
因為他開始定義了數據長度,加上校驗和一共是四個位元組。
#define INBUF_LEN 4 //數據長度
你要發「12345」5個位元組的數據,加上校驗和一共六個位元組。要把這一句話改成:
#define INBUF_LEN 6 //數據長度
這樣就把數據包的長度定義為6個位元組
就像1樓所說,你到底是要發送12345五個值還是這五個字元的ASCII碼?
假如是五個值這樣計算
數值 二進制 發送代碼 發送的16進制數
1——0000 0001——1000 0001——81
2——0000 0010——0000 0010——02
3——0000 0011——0000 0011——03
4——0000 0100——0000 0100——04
5——0000 0101——0000 0101——05
校驗和——————0000 0001——01
看到了吧,把首位元組最高位改成1,校驗和就是保證數據包中每一位的1出現偶數次(縱向看除第一位有偶數個1)。
在串口調試助手發送窗口寫上「81 02 03 04 05 01」選中16進制發送(或HEX發送)點發送就可以了。
同理,假如發送ASCII碼的話也一樣的計算,不過還要先查ASCII碼表找到對應的ASCII碼。(一般C程序的課本後面後,或者上網找圖)
數值 ASCII碼 發送代碼 發送的16進制數
1——31——0011 0001——1011 0001——b1
2——32——0011 0010——0011 0010——32
3——33——0011 0011——0011 0011——33
4——34——0011 0100——0011 0100——34
5——35——0011 0101——0011 0101——35
校驗和——————————0011 0001——31
在串口調試助手發送窗口寫上「b1 32 33 34 35 31」選中16進制發送(或HEX發送)點發送就可以了。
忽然覺得我很羅嗦誒...
⑤ 用51單片機怎麼做通信
這個題正好是我那年做的,呵呵,具體程序不知道扔哪兒了,你可以自己確定通信協議,我當時是借鑒的紅外遙控器的通信協議,根據高電平的長度不同確定是0還是1 ,然後上層的話自己定下前導碼和校驗碼,收到的時候計算下正確性在顯示
找到論文了:
3.通信協議分析
系統採用單片機軟體編碼,仿紅外式採用脈寬調制,利用高低電平脈沖寬度不同來區分0和1。編碼採用數據嗎+前導碼的方式,前導碼為9MS高電平+9MS低電平+4.5MS高電平。因為OOK默認不發送數據時是低電平,所以第一個9MS的高電平判斷可以濾除大多數的雜波干擾。發送1時延遲1.685ms高電平,0時延遲0.565MS高電平,如下圖:
圖2-3、數據1/0編碼
數據碼一次發送5位分別是D4(校驗碼,本次編程為0xaa),D3(地址碼),D2(溫度信息),D1(光照信息),D0(備用)。編碼時監測終端地址為(0x00),兩個節點地址可以用P1口帶的撥碼開關自己設置,范圍為(0x01-0xff),D1為0X01代表有光照,為0x02代表無光,為0x03代表中繼轉發並有光,為0x04代表中繼轉發並無光。
⑥ 51單片機與51單片機如何用CAN匯流排連接通訊急啊!!
CAN_H跟CAN_H接唄,CAN_L對CAN_L,地可接可不接。但是要保證兩邊都接了120歐姆的終端電阻。
⑦ 51單片機C語言的串口通訊協議
舉個例子
二、 串列口通訊方式:
2.1 工作方式:主從方式。上位機為主,順序閃光燈主機為從;控制命令和查詢命令由上位機發出,順序閃光燈主機做相應信息返回。
2.2 工作模式:8位數據,無校驗;對於51系列單片機為模式1
2.3 波特率:1200,2400,4800,9600(可選,預設為4800)。
2.4 信息格式:
序號 名稱 位元組數 內容 說明
1 幀信息頭 1 0xAA 用於表示信息的開始
2 幀信息類型 1 控制0x01 用於區別控制命令、查詢命令及返回信息;「控制」和「查詢」由上位機發出,「返回」為順序閃光燈主機返回信息時發出。
查詢0x02
返回0x03
3 有效信息長度 1 n 表示有效信息的位元組數
4 有效信息 n n個位元組 有效信息。詳見具體信息定義
5 校驗碼 1 LRC 對幀信息類型、有效信息長度、有效信息進行單位元組相加,取低8位補碼(即對低8位取反後再加一)作為校驗碼。
說明:上位機和順序閃光燈主機使用相同的信息格式,不同之處在於信息類型、信息長度的不同。
⑧ 51單片機485通訊協議怎麼寫 有代碼最好
所謂通訊協議 只是一種約定,如果都是 自己做的系統,只要自己定製一個就可以了,
如果與 其它 系統 通訊 ,則需要 知道 其通訊協議內容,
如 一個簡單的 通訊協議 控制指令
發送 01H 代表 打開開關
發送 02H 代表 關閉開關
則 發送端 發了 01H 接收端 收到 01H 就控制 打開開關
發送端 發了 02H 接收端 收到 02H 就控制 關閉開關
這感覺很簡單,在實際應用中 要 考慮 正確性 需要驗證,
如紅外遙控器 指令碼與反碼 接收端判斷 指令碼與反碼比較是否正確。
⑨ 51單片機怎樣實現SPI通訊
用傳統的51單片機實現SPI通訊,需要用I/O腳來模擬SPI協議,這比較麻煩。
選用STC8系列單片機,就具有了SPI介面了
,只需要對寄存器操作就行了。方便了很多了。如下圖,這是STC8系列中的4個子系列,還有其它的子系列,就不再列舉了。
⑩ 用51單片機實現與上位機無線通信
1、核心器件,首當是單片機,採用51系列。
1、簡單的溫控一般都是 18B20 ,便宜,調試簡單。
2、無線串口傳輸,可以採用 RF915 ,傳輸距離30米,上位機和下位機裝一對。
3、溫度曲線,就是時間軸和溫度的直觀表現,根據你采樣頻率,繪出曲線圖。
4、自己定義通訊協議,完成可靠的數據收發。