导航:首页 > 操作系统 > 单片机协议

单片机协议

发布时间:2022-01-25 06:09:28

1. 在单片机学科中,所说的协议是指什么芯片之间的协议有几种协议分别是什么

指的就是通信协议呗 rs232 rs485 rs422 profibus协议等等

2. 单片机与pc机的握手协议怎么写~!

第一步、要规定通讯波特率、起止位数、数据位、校验位等内容
比如:波特率9600,1个起始位,1个停止位,8个数据位,无校验位。

第二步、要确定通讯信息的执行流程,全双工、半双工等。最常用的是半双工模式,也就是一问一答方式。比如:采用半双工模式,流程如下
1、发送端发送1帧信息(发送)
2、发起端进入等待状态,等待接收端应答;
3、接收端接收后解析该信息并完成处理,然后将处理结果回送给通讯发起端(应答)
4、发起端收到应答,回到1、。
如此循环下去。

第三步、要规定通讯帧格式。
简单的协议格式可以是这种结构:
1、发送端: 帧头 + 帧长度 + 信息内容 +校验
帧头:可以用1、2个特殊数字来表示,比如0x1B、0x10;代表一帧的起始
帧长度:用于说明本帧数据的长度,一般用1个字节比较好
信息内容:不说了
校验:可以将前3段的所有信息求和,这样接收端可以进行同样的运算然后比较结果,从而判断接收到的信息是否有错。
举例:1B 10 0A 00 01 02 03 04 05 06 07 08 09 62
------- --- --------------------------------------- ---
帧头 长度 信息 校验和
2、接收端应答信息:
处理成功:'O'+'K'+ 应答信息长度 + 应答信息内容 + 校验和
处理失败:'E'+'R'+ 应答信息长度 + 应答信息内容(错误代码) + 校验和
举例:'O'+'K' 01 09 xx
------- --- ---- ---
帧头 长度 信息 校验和

这种方式及数据结构在串口通讯的实际使用中应用极广,花点时间去琢磨还是值得的。当然,上面只是提供了思路,要想保证通讯的完整性和正确性,协议中还要补充不少东西,比如接收端处理失败怎么办、收发信息错误或不完整怎么办、一帧信息容不下全部数据怎么办等等。

具体到双方握手,以上述模式为例:
发送端发送:1B 10 01 00 2C
------------- ---- ----- -----
帧头 长度 握手命令 校验和
接收方应答:'O'+'K' 01 09 xx
------- --- ---- ---
帧头 长度 信息 校验和

3. 单片机有哪些协议

:学习好单片机,最主要的是实践,在实践中增长经验。在校学生的话,实践机会的确会比较少,但是有机会的话,可以毕业实习选择相关的课题,这样就可以接触到实际的项目。而且如果单片机微机原理是一门主课的话,相信学校会安排比较多的实践上机机会。有能力的话,可以找一些相关兼职工作做做,会更有帮助。而且单片机开发应用需要软硬件结合,所以不能只满足于编程技巧如何完美,平时也要注意硬件知识的积累,多上上电子论坛网站,买一些相关杂志。可能的话,可以到电子市场去买一些小零件,自己搭一个小系统让它工作起来。
HOTLEK的单片机是RISC结构的8位单片机,它可以广泛应用在家用电器、安全系统、掌上游戏等方面。大概来说可以分成I/O型单片机、LCD型单片机、A/D型单片机、A/D with LCD型单片机等等

4. 单片机中所说的通信协议是什么

单片机通信协议
现在大部分的仪器设备都要求能过通过上位机软件来操作,这样方便调试,利于操作。其中就涉及到通信的过程。在实际制作的几个设备中,笔者总结出了通信程序的通用写法,包括上位机端和下位机端等。
1.自定义数据通信协议

这里所说的数据协议是建立在物理层之上的通信数据包格式。所谓通信的物理层就是指我们通常所用到的RS232、RS485、红外、光纤、无线等等通信方式。在这个层面上,底层软件提供两个基本的操作函数:发送一个字节数据、接收一个字节数据。所有的数据协议全部建立在这两个操作方法之上。
通信中的数据往往以数据包的形式进行传送的,我们把这样的一个数据包称作为一帧数据。类似于网络通信中的TCPIP协议一般,比较可靠的通信协议往往包含有以下几个组成部分:帧头、地址信息、数据类型、数据长度、数据块、校验码、帧尾。

帧头和帧尾用于数据包完整性的判别,通常选择一定长度的固定字节组成,要求是在整个数据链中判别数据包的误码率越低越好。减小固定字节数据的匹配机会,也就是说使帧头和帧尾的特征字节在整个数据链中能够匹配的机会最小。通常有两种做法,一、减小特征字节的匹配几率。二、增加特征字节的长度。通常选取第一种方法的情况是整个数据链路中的数据不具有随即性,数据可预测,可以通过人为选择帧头和帧尾的特征字来避开,从而减小特征字节的匹配几率。使用第二种方法的情况更加通用,适合于数据随即的场合。通过增加特征字节的长度减小匹配几率,虽然不能够完全的避免匹配的情况,但可以使匹配几率大大减小,如果碰到匹配的情况也可以由校验码来进行检测,因此这种情况在绝大多说情况下比较可靠。

地址信息主要用于多机通信中,通过地址信息的不同来识别不同的通信终端。在一对多的通信系统中,可以只包含目的地址信息。同时包含源地址和目的地址则适用于多对多的通信系统。

数据类型、数据长度和数据块是主要的数据部分。数据类型可以标识后面紧接着的是命令还是数据。数据长度用于指示有效数据的个数。

校验码则用来检验数据的完整性和正确性。通常对数据类型、数据长度和数据块三个部分进行相关的运算得到。最简单的做法可是对数据段作累加和,复杂的也可以对数据进行CRC运算等等,可以根据运算速度、容错度等要求来选取。

2.上位机和下位机中的数据发送

物理通信层中提供了两个基本的操作函数,发送一个字节数据则为数据发送的基础。数据包的发送即把数据包中的左右字节按照顺序一个一个的发送数据而已。当然发送的方法也有不同。

在单片机系统中,比较常用的方法是直接调用串口发送单个字节数据的函数。这种方法的缺点是需要处理器在发送过程中全程参与,优点是所要发送的数据能够立即的出现在通信线路上,能够立即被接收端接收到。另外一种方法是采用中断发送的方式,所有需要发送的数据被送入一个缓冲区,利用发送中断将缓冲区中的数据发送出去。这种方法的优点是占用处理器资源小,但是可能出现需要发送的数据不能立即被发送的情况,不过这种时延相当的小。对于51系列单片机,比较倾向于采用直接发送的方式,采用中断发送的方式比较占用RAM资源,而且对比直接发送来说也没有太多的优点。以下是51系列单片机中发送单个字节的函数。

void SendByte(unsigned char ch)
{
SBUF = ch;
while(TI == 0);
TI = 0;
}

上位机中关于串口通信的方式也有多种,这种方式不是指数据有没有缓冲的问题,而是操作串口的方式不同,因为PC上数据发送基本上都会被缓冲后再发送。对于编程来说操作串口有三种方式,一、使用windows系统中自带的串口通信控件,这种方式使用起来比较简单,需要注意的是接收时的阻塞处理和线程机制。二、使用系统的API直接进行串口数据的读取,在windows和linux系统中,设备被虚拟为文件,只需要利用系统提供的API函数即可进行串口数据的发送和读取。三、使用串口类进行串口操作。在此只介绍windows环境下利用串口类编程的方式。

CSerialPort是比较好用的串口类。它提供如下的串口操作方法:

void WriteToPort(char* string, int len);

串口初始化成功后,调用此函数即可向串口发送数据。为了避免串口缓冲所带来的延时,可以开启串口的冲刷机制。

3.下位机中的数据接收和协议解析

下位机接收数据也有两种方式,一、等待接收,处理器一直查询串口状态,来判断是否接收到数据。二、中断接收。两种方法的优缺点在此前的一篇关于串口通信的文章中详细讨论过。得出的结论是采用中断接收的方法比较好。

数据包的解析过程可以设置到不同的位置。如果协议比较简单,整个系统只是处理一些简单的命令,那么可以直接把数据包的解析过程放入到中断处理函数中,当收到正确的数据包的时候,置位相应的标志,在主程序中再对命令进行处理。如果协议稍微复杂,比较好的方式是将接收的数据存放于缓冲区中,主程序读取数据后进行解析。也有两种方式交叉使用的,比如一对多的系统中,首先在接收中断中解析“连接”命令,连接命令接收到后主程序进入设置状态,采用查询的方式来解析其余的协议。

以下给出具体的实例。在这个系统中,串口的命令非常简单。所有的协议全部在串口中断中进行。数据包的格式如下:

0x55, 0xAA, 0x7E, 0x12, 0xF0, 0x02, 0x23, 0x45, SUM, XOR, 0x0D

其中0x55, 0xAA, 0x7E为数据帧的帧头,0x0D为帧尾,0x12为设备的目的地址,0xF0为源地址,0x02为数据长度,后面接着两个数据0x23, 0x45,从目的地址开始结算累加、异或校验和,到数据的最后一位结束。

协议解析的目的,首先判断数据包的完整性,正确性,然后提取数据类型,数据等数据,存放起来用于主程序处理。代码如下:

if(state_machine == 0) // 协议解析状态机
{
if(rcvdat == 0x55) // 接收到帧头第一个数据
state_machine = 1;
else
state_machine = 0; // 状态机复位
}
else if(state_machine == 1)
{
if(rcvdat == 0xAA) // 接收到帧头第二个数据
state_machine = 2;
else
state_machine = 0; // 状态机复位
}
else if(state_machine == 2)
{
if(rcvdat == 0x7E) // 接收到帧头第三个数据
state_machine = 3;
else
state_machine = 0; // 状态机复位
}
else if(state_machine == 3)
{
sumchkm = rcvdat; // 开始计算累加、异或校验和
xorchkm = rcvdat;
if(rcvdat == m_SrcAdr) // 判断目的地址是否正确
state_machine = 4;
else
state_machine = 0;
}
else if(state_machine == 4)
{
sumchkm += rcvdat;
xorchkm ^= rcvdat;
if(rcvdat == m_DstAdr) // 判断源地址是否正确
state_machine = 5;
else
state_machine = 0;
}
else if(state_machine == 5)
{
lencnt = 0; // 接收数据计数器
rcvcount = rcvdat; // 接收数据长度
sumchkm += rcvdat;
xorchkm ^= rcvdat;
state_machine = 6;
}
else if(state _machine == 6 || state _machine == 7)
{
m_ucData[lencnt++] = rcvdat; // 数据保存
sumchkm += rcvdat;
xorchkm ^= rcvdat;
if(lencnt == rcvcount) // 判断数据是否接收完毕
state_machine = 8;
else
state_machine = 7;
}
else if(state_machine == 8)
{
if(sumchkm == rcvdat) // 判断累加和是否相等
state_machine = 9;
else
state_machine = 0;
}
else if(state_machine == 9)
{
if(xorchkm == rcvdat) // 判断异或校验和是否相等
state_machine = 10;
else
state_machine = 0;
}
else if(state_machine == 10)
{
if(0x0D == rcvdat) // 判断是否接收到帧尾结束符
{
retval = 0xaa; // 置标志,表示一个数据包接收到
}
state_machine = 0; // 复位状态机
}

此过程中,使用了一个变量state_machine作为协议状态机的转换状态,用于确定当前字节处于一帧数据中的那个部位,同时在接收过程中自动对接收数据进行校验和处理,在数据包接收完的同时也进行了校验的比较。因此当帧尾结束符接收到的时候,则表示一帧数据已经接收完毕,并且通过了校验,关键数据也保存到了缓冲去中。主程序即可通过retval的标志位来进行协议的解析处理。

接收过程中,只要哪一步收到的数据不是预期值,则直接将状态机复位,用于下一帧数据的判断,因此系统出现状态死锁的情况非常少,系统比较稳定,如果出现丢失数据包的情况也可由上位机进行命令的补发,不过这种情况笔者还没有碰到。

对于主程序中进行协议处理的过程与此类似,主程序循环中不断的读取串口缓冲区的数据,此数据即参与到主循环中的协议处理过程中,代码与上面所述完全一样。

4.上位机中的数据接收和命令处理

上位机中数据接收的过程与下位机可以做到完全一致,不过针对不同的串口操作方法有所不同。对于阻赛式的串口读函数,例如直接进行API操作或者调用windows的串口通信控件,最好能够开启一个线程专门用于监视串口的数据接收,每接收到一个数据可以向系统发送一个消息。笔者常用的CSerialPort类中就是这样的处理过程。CSerialPort打开串口后开启线程监视串口的数据接收,将接收的数据保存到缓冲区,并向父进程发送接收数据的消息,数据将随消息一起发送到父进程。父进程中开启此消息的处理函数,从中获取串口数据后就可以把以上的代码拷贝过来使用。

CSerialPort向父类发送的消息号如下:

#define WM_COMM_RXCHAR WM_USER+7 // A character was received and placed in the input buffer.
因此需要手动添加此消息的响应函数:

afx_msg LONG OnCommunication(WPARAM ch, LPARAM port);
ON_MESSAGE(WM_COMM_RXCHAR, OnCommunication)

响应函数的具体代码如下:

LONG CWellInfoView::OnCommunication(WPARAM ch, LPARAM port)
{
int retval = 0;
rcvdat = (BYTE)ch;
if(state_machine == 0) // 协议解析状态机
{
if(rcvdat == 0x55) // 接收到帧头第一个数据
state_machine = 1;
else
state_machine = 0; // 状态机复位
}
else if(state_machine == 1)
{
if(rcvdat == 0xAA) // 接收到帧头第二个数据
state_machine = 2;
else
state_machine = 0; // 状态机复位
......

5.总结

以上给出的是通信系统运作的基本雏形,虽然简单,但是可行。实际的通信系统中协议比这个要复杂,而且涉及到数据包响应、命令错误、延时等等一系列的问题,在这样的一个基础上可以克服这些困难并且实现出较为稳定可靠的系统

5. 51单片机与TCP IP协议

看懂了底层协议就可以做了,没什么难的,只不过速度要大打折扣,跟不上标准协议的要求。如果收发都用这种低速的就没有问题。

6. 单片机通讯协议有哪些

1、单片机与其他单片机或芯片级的通讯有:RS232、IIC、SPI、并口(I/O)、DMA(如msp430、ARM);
2、单片机通过电缆与PC或其他设备通讯有:RS232、RS485、USB、CAN、光纤、以太网;
3、单片机远距离传输通讯(超过10米):RS485、CAN、以太网等。

7. 请问单片机上的串口通讯用的是什么协议 跟Modbus通讯有什么区别

“请问单片机上的串口通讯用的是什么协议”
单片机上的串口只是提供一个物理接口而已。具体在应用中如何使用、如何接口、采用何种协议完全是由用户来定义的(从这个角度来说,“协议”不仅与硬件相关,可能更加偏向于软件一些)。通过单片机的串口完全可以实现Modbus RTU协议(Modbus232或Modbus485皆可)。
你对这几个概念还没有完全厘清。

8. 单片机的底层通讯协议是指什么

你好,
就我个人理解,协议包括通讯方式和通讯内容两个内容。
通讯方式有232,ttl,485,422,can等。
通讯内容需要你们自己决定,比如数据的首尾是什么,中间每一字节又代表什么,是否需要校验,校验的方式又是什么。你收到数据后是不是要回数据?如果出错了要怎么办?
祝你生活愉快。

9. 单片机通信协议有哪些

可以说:没有不同;也可以说:完全不同!网络通信协议和单片机通信协议都是协议,也就是在通讯过程中,都需要这个标准,需要按照这样的格式传输数据。记住,所谓协议,就是要求你传输数据用的格式,有一些格式是你自己定义的,有的为了兼容,就是通用,就用一些标准协议,比如TCP/IP协议。定义某个协议,就是要满足你的通讯要求,没有太复杂的概念。

10. 单片机协议是什么

就是把数据分成一帧一帧地传送,一帧数据由发送起始位、数据位、校验码位、结束位组成,接收方按照这种数据结构解析出数据。这就是单片机通信协议。

阅读全文

与单片机协议相关的资料

热点内容
主教的命令 浏览:803
php判断变量为空 浏览:743
你演我猜安卓版本怎么用 浏览:907
已够app哪里看 浏览:1005
程序员怎么学会开车的技巧 浏览:783
网易邮箱如何删除服务器邮件 浏览:152
java多个泛型 浏览:274
安卓折扣号怎么充值 浏览:602
行政决定行政命令 浏览:894
linux下的软连接 浏览:605
fib在python是什么意思 浏览:534
c调用命令行 浏览:942
阿里云服务器中没有apt 浏览:611
发送信息需要用户加密吗 浏览:638
六年级分数乘分数有几种算法 浏览:300
到哪里查自己的app账号 浏览:124
光大app点击哪里可以查年费 浏览:879
加密狗软件先安装还是先先后顺序 浏览:356
柱头加密区箍筋间距一般多少 浏览:685
美团商家版本服务中心在app哪里 浏览:992