標題: 單片機串口通信協議怎么寫 求幫助 [打印本頁]
作者: 問問121 時間: 2019-6-17 17:24
標題: 單片機串口通信協議怎么寫 求幫助
計算機從串口發送自己的學號(十六進制),單片機收到后,如果和自己的學號比較相等,則延時100ms后應答0xAA,如果不是自己的學號,則應答0x55;
作者: charles11 時間: 2019-6-17 21:46
先把串口初始化,然后定義一個串口中斷函數,把自己的學號定義為宏,把接受到的數賦給一個變量,用if語句判斷是不是等于,如果是延時發送0xAA,不是就發送0x55.
作者: lwh999995 時間: 2019-6-17 21:57
這論壇 伸手黨 還真不少
百度的答案比論壇快多了
作者: suncat0504 時間: 2019-6-17 22:17
樓主口中的協議,是不是指上層協議。基本的串口協議就是9600,n,8,1之類的。你想要的,需要自己建立一個協議,組織代碼實現。你可以根據學號的長度,聲明一個串口接收數據的緩沖區,長度要超過學號的長度。當串口收到某個特殊字符的時候,認為來自上位機的串口數據已經發完整了,然后下位機去對接收緩沖區的數據進行檢查。基本思路就是這樣。
作者: suncat0504 時間: 2019-6-17 22:21
我建議還是采用ASCII+特殊字符的方式發送學號,避免數據干擾,比如學號使用特殊字母數字,加上校驗數據,最后是發送結束標志(比如\0字符)。這樣做雖然麻煩,但數據收發比較穩妥。你可以參考工業用到的一種串口協議MODBUS。
作者: yzwzfyz 時間: 2019-6-18 08:30
協議:就是一份雙方約定共同遵守合同。只要雙方能共同遵守,怎么寫都可以。
如果你個性強,不必與別人相同。
作者: 色弟弟 時間: 2020-6-8 13:27
請問這個實驗你有做出來嗎
作者: 色弟弟 時間: 2020-6-8 13:28
計算機從串口發送自己的學號(十六進制),單片機收到后,如果和自己的學號比較相等,則延時100ms后應答0xAA,如果不是自己的學號,則應答0x55;
作者: 碼不止 時間: 2020-6-8 20:24
你可以拿本單片機的書先看一下,不要把它想得多復雜,幾個例子就明白了
作者: 渣渣馬 時間: 2020-6-8 22:08
師兄,你的16進制,具體指的啥?
作者: 渣渣馬 時間: 2020-6-8 22:21
#include<reg51.h>
#include<intrins.h>
#define uchar unsigned char
#define ID 0xf2 //不知道學號是不是這個樣子?
int code DATA[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //CA12Ñô¶ÎÂë
void DelayMs(int x) //Ñóê±
{
int i;
while(x--) for(i=0;i<120;i++);
}
double pow(int a,int b) //Ö¸êyÔËËã
{
double y=1;
if(b==0) return y;
while(b--) y*=a;
return y;
}
void Trasmit(uchar a) //·¢Ëíêy¾Y
{
SBUF=a;
while(!TI); //μè′y·¢Ëííê3é
TI=0;
}
void init()
{
IE=0xa0; //¿a′®¿úoíT0ÖD¶Ï
TI=RI=0;
SCON=0x50; //′®¿ú·½ê½1,RENÖÃ1ÔêDí½óêÕ
PCON=0x00; //2¨ìØÂê2»±¶Ôö
TMOD=0x20; //T0¶¨ê±·½ê½0oíT1¶¨ê±·½ê½2
TH1=0xfd;
TR1=1; //¿aÆô¶¨ê±Æ÷
}
void main()
{
init();
while(1);
}
void RS_inter() interrupt 4 //PC·¢à′μÄêy¾Y′|àí
{
if(RI)
{
if(SBUF==ID) DelayMs(100),Trasmit(0xAA);
else Trasmit(0x55);
}
}
/*不知道對不對*/
| 歡迎光臨 (http://m.raoushi.com/bbs/) |
Powered by Discuz! X3.1 |