当前位置:文档之家› 通用单片机通讯协议(ASCII)

通用单片机通讯协议(ASCII)

组态王与单片机协议

1.通讯口设置:

通讯方式:RS-232,RS-485,RS-422均可。

波特率:由单片机决定(2400,4800,9600and19200bps)。

程中的通讯参数一致

2.在组态王中定义设备地址的格式

格式:##.#

前面的两个字符是设备地址,范围为0-255,此地址为单片机的地址,由单片机中的程序决定;

后面的一个字符是用户设定是否打包,“0”为不打包、“1”为打包,用户一旦在定义设备时确定了打包,组态王将处理读下位机变量时数据打包的工作。

注意:在组态王中定义变量时,一个X寄存器根据所选数据类型(BYTE,UINT,FLOAT)的不同分别占用一个、两个,四个字节,定义不同的数据类型要注意寄存器后面的地址,同一数据区内不可交叉定义不同数据类型的变量。为提高通讯速度建议用户使用连续的数据区。

例如,

1、在单片机中定义从地址0开始的数据类型为BYTE型的变量:

则在组态王中定义相应的变量的寄存器为X0、X1、X2、X3、X4。。。。。。。。,数据类型为BYTE,每个变量占一个字节

2、在单片机中定义从地址100开始的数据类型为UINT型的变量:

则在组态王中定义相应的变量的寄存器为X100、X102、X104、X106、X108。。。。。。。。,数据类型UINT,每个变量占两个字节

3、在单片机中定义从地址200开始的数据类型为FLOAT型的变量:

则在组态王中定义相应的变量的寄存器为X200、X204、X208、X212。。。。。。。,数据类型FLOAT,每个变量占四个字节

3.组态王与单片机通讯的命令格式:

说明;

字头:1字节1个ASCII码,40H

设备地址:1字节2个ASCII码,0—255(即0---0x0ffH)

标志:1字节2个ASCII码,bit0~bit7,

bit0= 0:读,bit0= 1:写。

bit1= 0:不打包。

bit3bit2 = 00,数据类型为字节。

bit3bit2 = 01,数据类型为字。

bit3bit2 = 1x,数据类型为浮点数。

数据地址:2字节4个ASCII码,0x0000~0xffff

数据字节数:1字节2个ASCII码,1—100,实际读写的数据的字节数。

数据…:为实际的数据转换为ASCII码,个数为字节数乘2。

异或:异或从设备地址到异或字节前,异或值转换成2个ASCII码

CR:0x0d。

通讯尝试恢复命令(COMERROR),请求地址为0的一个BYTE数据

100,数据类型为字节,不打包。组态王所发

,数据类型为字节,打包。组

100

,数据类型为字,不打包。组态王所发数

65535,数据类型为浮点型,打包。组态王所

4字节浮点数= 第一字节高4位ASCII码+第一字节低4位ASCII码

+第二字节高4位ASCII码+第二字节低4位ASCII码

+第三字节高4位ASCII码+第三字节低4位ASCII码

+第四字节高4位ASCII 码+第四字节低4位ASCII 码

第1字节低4位 第2字节低4位

第3字节低4位 第4字节低4位

第四字节浮点数格式:(1)第一字节 (2)第二字节(3)第三字节(4)第四字节

注:数符=0——正,数符=1——负

阶符=0——正,阶符=1——负

D7 D6 D5 ~ D0 ★ 浮点数可表示范围:-1×232~1×232

★ 数符:1

位 阶符:1位 阶码:6位 例:流量积算控制仪表瞬时流量测量值数据=100.210

转换成浮点数:100.210=2

7?0.7828125=0716+C816+6616+6616

=30ASCII +37ASCII +43ASCII +38ASCII +36ASCII +36ASCII +36ASCII +36ASCII

小数部份:0.7828125 ? 0.7828125?256=200.4? 0.4?256=102.4?0.4?256=102.4

10进制: 第一字节 第二字节 第三字节 第四字节

十六进制: ASCII 码: 第一字节 第二字节 第三字节

小数部分乘以256 整数部份为第二字节(200) 第二字节小数部分乘以256

整数部份为第三字节(102)

第三字节小数部分乘以256 整数部份为第四字节(102)

第四字节

传输格式如下:

第1字节低4位第2字节低4位第3字节低4位第4字节低4位

第1字节高4位第2字节高4位第3字节高4位第4字节高4位

3、注:

仪表内部数据为十六进制表示的十进制数。如:实时测量值为500,则用十六进制表示为1F4H。仪表通讯传输是将上述十六进制数据转化为标准ASCII码(即一字节的

16进制数转化为2个ASCII码──高4位ASCII码+低4位ASCII码)。

如:上述数据1F4H(16进制),传输时,转化为ASCII码则为30H、31H、46H、34H。6.此浮点数格式的转换:

1)ASCII码到浮点数:

/*

in:char* c

要转化的ASII码字符,应为4个字符。

Return :转换后的浮点数。

*/

float C4toD(char * c)

{

BYTE Hd[30], Jiema[30];

float DTc[30];

float Decimal = 0;

memset(Hd, 0, sizeof(Hd));

memset(Jiema, 0, sizeof(Jiema));

memset(DTc, 0, sizeof(DTc));

float returnflo = 0;

BOOL ShuFU = FALSE, JieFU = FALSE;

if((c[7] > 0x40) && (c[7] < 0x47))

Hd[7] = ((c[7] - 0x37) & 0x0f);

else if((c[7] > 0x60) && (c[7] < 0x67))

Hd[7] = ((c[7] - 0x57) & 0x0f);

else

Hd[7] = ((c[7] - 0x30) & 0x0f);

if((c[6] > 0x40) && (c[6] < 0x47))

Hd[6] = ((c[6] - 0x37) & 0x0f);

else if((c[6] > 0x60) && (c[6] < 0x67))

Hd[6] = ((c[6] - 0x57) & 0x0f);

else

Hd[6] = ((c[6] - 0x30) & 0x0f);

DTc[2] = (float)(((float)(Hd[6] * 16.0) + (float)(Hd[7])) / 256.0);

if((c[5] > 0x40) && (c[5] < 0x47))

Hd[5] = ((c[5] - 0x37) & 0x0f);

else if((c[5] > 0x60) && (c[5] < 0x67))

Hd[5] = ((c[5] - 0x57) & 0x0f);

else

Hd[5] = ((c[5] - 0x30) & 0x0f);

if((c[4] > 0x40) && (c[4] < 0x47))

Hd[4] = ((c[4] - 0x37) & 0x0f);

else if((c[4] > 0x60) && (c[4] < 0x67))

Hd[4] = ((c[4] - 0x57) & 0x0f);

else

Hd[4] = ((c[4] - 0x30) & 0x0f);

DTc[1] = (float)((((float)(Hd[4] * 16.0) + (float)Hd[5]) + DTc[2]) / 256.0); if((c[3] > 0x40) && (c[3] < 0x47))

Hd[3] = ((c[3] - 0x37) & 0x0f);

else if((c[3] > 0x60) && (c[3] < 0x67))

Hd[3] = ((c[3] - 0x57) & 0x0f);

else

Hd[3] = ((c[3] - 0x30) & 0x0f);

if((c[2] > 0x40) && (c[2] < 0x47))

Hd[2] = ((c[2] - 0x37) & 0x0f);

else if((c[2] > 0x60) && (c[2] < 0x67))

Hd[2] = ((c[2] - 0x57) & 0x0f);

else

Hd[2] = ((c[2] - 0x30) & 0x0f);

Decimal = (float)(((float)(Hd[2] * 16) + (float)(Hd[3]) + DTc[1])/ 256.0); if((c[1] > 0x40) && (c[1] < 0x47))

Jiema[1] = ((c[1] - 0x37) & 0x0f);

else if((c[1] > 0x60) && (c[1] < 0x67))

Jiema[1] = ((c[1] - 0x57) & 0x0f);

else

Jiema[1] = ((c[1] - 0x30) & 0x0f);

if((c[0] > 0x40) && (c[0] < 0x47))

Jiema[0] = ((c[0] - 0x37) & 0x0f);

else if((c[0] > 0x60) && (c[0] < 0x67))

Jiema[0] = ((c[0] - 0x57) & 0x0f);

else

Jiema[0] = ((c[0] - 0x30) & 0x0f);

ShuFU = ((Jiema[0] & 0x08) >> 3) > 0;

JieFU = ((Jiema[0] & 0x04) >> 2) > 0;

Jiema[2] = (Jiema[0] & 0x03) * 16 + Jiema[1];

if(JieFU)

returnflo = (float)pow(2, (-1) * Jiema[2]) * Decimal;

else

returnflo = (float)pow(2, Jiema[2]) * Decimal;

if(ShuFU)

returnflo = (-1) * returnflo;

return returnflo;

}

2)浮点数到ASCII码:

/*

in:char * c:

存储浮点数转换后的ASCII码字符。

Float d:

要转换的浮点数。

Return : 无。

*/

void D4toC(char * c,float d)

{

BYTE i = 0, Jiema = 0;

char inbyte1[30];

BOOL ShuFu = FALSE, JieFu = FALSE;

int inbyte2 = 0, inbyte3 = 0, inbyte4 = 0;

char afterbyte2[30], afterbyte3[30], afterbyte4[30];

float F_afterbyte2 = 0, F_afterbyte3 = 0, F_afterbyte4 = 0;

memset(inbyte1, 0x30, sizeof(inbyte1));

memset(afterbyte2, 0x30, sizeof(afterbyte2));

memset(afterbyte3, 0x30, sizeof(afterbyte3));

memset(afterbyte4, 0x30, sizeof(afterbyte4));

inbyte1[10] = 0x0;

afterbyte2[10] = 0x0;

afterbyte3[10] = 0x0;

afterbyte4[10] = 0x0;

if(d == 0)

{

for(int j = 0; j < 8; j++)

c[j] = 0x30;

return;

}

if(d < 0)

{

ShuFu = TRUE;

d = (-1) * d;

}

while(d > 1)

{

d =(float)(d / 2.0);

i ++;

}

while(d <= 0.5)

{

JieFu = TRUE;

d = (float)(d * 2.0);

i ++;

}

if(d == 1)

{

for(int j = 2; j < 8; j++)

c[j] = 0x46;

}

else

{

inbyte2 = (int)(d * 256);

F_afterbyte2 = (d * 256) - (int)(d * 256);

inbyte3 = (int)(F_afterbyte2 * 256);

F_afterbyte3 = (F_afterbyte2 * 256) - (int)(F_afterbyte2 * 256);

inbyte4 = (int)(F_afterbyte3 * 256);

F_afterbyte4 = (F_afterbyte3 * 256) - (int)(F_afterbyte3 * 256);

itoa(inbyte2, afterbyte2, 16);

itoa(inbyte3, afterbyte3, 16);

itoa(inbyte4, afterbyte4, 16);

if(inbyte2 == 0)

{

c[2] = 0x30;

c[3] = 0x30;

}

else if(inbyte2 < 16)

{

c[2] = 0x30;

c[3] = afterbyte2[0];

}

else

{

c[2] = afterbyte2[0];

c[3] = afterbyte2[1];

}

if(inbyte3 == 0)

{

c[4] = 0x30;

c[5] = 0x30;

}

else if(inbyte3 < 16)

{

c[4] = 0x30;

c[5] = afterbyte3[0];

}

else

{

c[4] = afterbyte3[0];

c[5] = afterbyte3[1];

}

if(inbyte4 == 0)

{

c[6] = 0x30;

c[7] = 0x30;

}

else if(inbyte4 < 16)

{

c[6] = 0x30;

c[7] = afterbyte4[0];

}

else

{

c[6] = afterbyte4[0];

c[7] = afterbyte4[1];

}

}

if(JieFu)

{

if(i > 0x3f)

i = 0x3f;

}

else if(i > 0x32)

i = 32;

if(ShuFu)

i = i | 0x80;

if(JieFu)

i = i | 0x40;

itoa(i, inbyte1, 16);

if(inbyte1 == 0)

{

c[0] = 0x30;

c[1] = 0x30;

}

else if(i < 16)

{

c[0] = 0x30;

c[1] = inbyte1[0];

}

else

{

c[0] = inbyte1[0];

c[1] = inbyte1[1];

}

for(i = 0; i < 8; i ++)

{

if((c[i] > 0x60) && (c[i] < 0x67))

c[i] = c[i] - 0x20;

}

c[8] = 0x00;

}

常用ASCII码表对照表

常用ASCII码表对照表

键盘常用ASCII码 ESC键VK_ESCAPE (27) 回车键:VK_RETURN (13) TAB键:VK_TAB (9) Caps Lock键:VK_CAPITAL (20) Shift键:VK_SHIFT ($10) Ctrl键:VK_CONTROL (17) Alt键:VK_MENU (18) 空格键:VK_SPACE ($20/32) 退格键:VK_BACK (8) 左徽标键:VK_LWIN (91) 右徽标键:VK_LWIN (92) 鼠标右键快捷键:VK_APPS (93) Insert键:VK_Insert (45) Home键:VK_HOME (36) Page Up:VK_PRIOR (33) PageDown:VK_NEXT (34) End键:VK_END (35) Delete键:VK_Delete (46) 方向键(←):VK_LEFT (37) 方向键(↑):VK_UP (38) 方向键(→):VK_RIGHT (39) 方向键(↓):VK_DOWN (40) F1键:VK_F1 (112) F2键:VK_F2 (113) F3键:VK_F3 (114) F4键:VK_F4 (115) F5键:VK_F5 (116)

F6键:VK_F6 (117) F7键:VK_F7 (118) F8键:VK_F8 (119) F9键:VK_F9 (120) F10键:VK_F10 (121) F11键:VK_F11 (122) F12键:VK_F12 (123) Num Lock键:VK_NUMLOCK (144) 小键盘0:VK_NUMPAD0 (96) 小键盘1:VK_NUMPAD0 (97) 小键盘2:VK_NUMPAD0 (98) 小键盘3:VK_NUMPAD0 (99) 小键盘4:VK_NUMPAD0 (100) 小键盘5:VK_NUMPAD0 (101) 小键盘6:VK_NUMPAD0 (102) 小键盘7:VK_NUMPAD0 (103) 小键盘8:VK_NUMPAD0 (104) 小键盘9:VK_NUMPAD0 (105) 小键盘.:VK_DECIMAL (110) 小键盘*:VK_MULTIPLY (106) 小键盘+:VK_MULTIPLY (107) 小键盘-:VK_SUBTRACT (109) 小键盘/:VK_DIVIDE (111) Pause Break键:VK_PAUSE (19) Scroll Lock键:VK_SCROLL (145)

单片机串口通信协议程序

#include #include #define R55 101 #define RAA 202 #define RLEN 203 #define RDATA 104 #define RCH 105 //#define unsigned char gRecState=R55; unsigned char gRecLen; unsigned char gRecCount; unsigned char RecBuf[30]; unsigned char gValue; void isr_UART(void) interrupt 4 using 1 { unsigned char ch; unsigned char i; unsigned char temp; if (RI==1) { ch=SBUF; switch(gRecState) { case R55: // wait 0x55 if (ch==0x55) gRecState=RAA; break;

case RAA: if (ch==0xaa) gRecState=RLEN; else if (ch==0x55) gRecState=RAA; else gRecState=R55; break; case RLEN: gRecLen=ch; gRecCount=0; gRecState=RDATA; break; case RDATA: RecBuf[gRecCount]=ch; gRecCount++; if (gRecCount>=gRecLen) { gRecState=RCH; } break; case RCH: temp=0; for(i=0;i

设计单片机通讯协议论文(非常经典)

如何设计单片机常用通信 协议论文

目录 1.自定义数据通信协议 (3) 2.上位机和下位机中的数据发送 (3) 3.下位机中的数据接收和协议解析 (4) 4.上位机中的数据接收和命令处理 (8) 5.总结 (9)

单片机通信协议现在大部分的仪器设备都要求能过通过上位机软件来操作,这样方便调试,利于操作。其中就涉及到通信的过程。在实际制作的几个设备中,笔者总结出了通信程序的通用写法,包括上位机端和下位机端等。 1.自定义数据通信协议 这里所说的数据协议是建立在物理层之上的通信数据包格式。所谓通信的物理层就是指我们通常所用到的RS232、RS485、红外、光纤、无线等等通信方式。在这个层面上, 底层软件提供两个基本的操作函数:发送一个字节数据、接收一个字节数据。所有的数据协议全部建立在这两个操作方法之上。通信中的数据往往以数据包的形式进行传送的,我们把这样的一个数据包称作为一帧数据。类似于网络通信中的TCPIP协议一般,比较可靠的通信协议往往包含有以下几个组成部分:帧头、地址信息、数据类型、数据长度、数据块、校验码、帧尾。 帧头和帧尾用于数据包完整性的判别,通常选择一定长度的固定字节组成,要求是在整个数据链中判别数据包的误码率越低越好。减小固定字节数据的匹配机会,也就是说使帧头和帧尾的特征字节在整个数据链中能够匹配的机会最小。通常有两种做法,一、减小特征字节的匹配几率。二、增加特征字节的长度。通常选取第一种方法的情况是整个数据链路中的数据不具有随即性,数据可预测,可以通过人为选择帧头和帧尾的特征字来避开,从而减小特征字节的匹配几率。使用第二种方法的情况更加通用,适合于数据随即的场合。通过增加特征字节的长度减小匹配几率,虽然不能够完全的避免匹配的情况,但可以使匹配几率大大减小,如果碰到匹配的情况也可以由校验码来进行检测,因此这种情况在绝大多说情况下比较可靠。 地址信息主要用于多机通信中,通过地址信息的不同来识别不同的通信终端。在一对多的通信系统中,可以只包含目的地址信息。同时包含源地址和目的地址则适用于多对多的通信系统。 数据类型、数据长度和数据块是主要的数据部分。数据类型可以标识后面紧接着的是命令还是数据。数据长度用于指示有效数据的个数。 校验码则用来检验数据的完整性和正确性。通常对数据类型、数据长度和数据块三个部分进行相关的运算得到。最简单的做法可是对数据段作累加和,复杂的也可以对数据进行CR C运算等等,可以根据运算速度、容错度等要求来选取。 2.上位机和下位机中的数据发送 物理通信层中提供了两个基本的操作函数,发送一个字节数据则为数据发送的基础。数据 包的发送即把数据包中的左右字节按照顺序一个一个的发送数据而已。当然发送的方

ascii码对照表完整版doc

**ASCII 码对照表完整版 信息在计算机上是用二进制表示的,这种表示法让人理解就很困难。因此计算机上都配有输入和输出设备,这些设备的主要目的就是,以一种人类可阅读的形式将信息在这些设备上显示出来供人阅读理解。为保证人类和设备,设备和计算机之间能进行正确的信息交换,人们编制的统一的信息交换代码,这就是ASCII码表,它的全称是“美国信息交换标准代码”。

ASCII 在Web开发时,如下的ASCII码只要加上&#和;就可以变成Web可以辨认的字符了在处理特殊字符的时候特别有用,如:' 单引号在数据库查询的时候是杀手,但是如果转换成'(注意:转换后的机构有:&# +字符的ASCII码值+; 三个部分组成)再来存数据库,就没有什么影响了。其他的字符与ASCII码的对照如下表 ASCII表

键盘常用ASCII码ESC键 VK_ESCAPE (27) 回车键: VK_RETURN (13) TAB键: VK_TAB (9) Caps Lock键: VK_CAPITAL (20) Shift键: VK_SHIFT ($10)

Ctrl键: VK_CONTROL (17) Alt键: VK_MENU (18) 空格键: VK_SPACE ($20/32) 退格键: VK_BACK (8) 左徽标键: VK_LWIN (91) 右徽标键: VK_LWIN (92) 鼠标右键快捷键:VK_APPS (93) Insert键: VK_INSERT (45) Home键: VK_HOME (36) Page Up: VK_PRIOR (33) PageDown: VK_NEXT (34) End键: VK_END (35) Delete键: VK_DELETE (46) 方向键(←): VK_LEFT (37) 方向键(↑): VK_UP (38) 方向键(→): VK_RIGHT (39) 方向键(↓): VK_DOWN (40) F1键: VK_F1 (112) F2键: VK_F2 (113) F3键: VK_F3 (114) F4键: VK_F4 (115) F5键: VK_F5 (116) F6键: VK_F6 (117) F7键: VK_F7 (118) F8键: VK_F8 (119) F9键: VK_F9 (120) F10键: VK_F10 (121) F11键: VK_F11 (122) F12键: VK_F12 (123) Num Lock键: VK_NUMLOCK (144) 小键盘0: VK_NUMPAD0 (96) 小键盘1: VK_NUMPAD0 (97) 小键盘2: VK_NUMPAD0 (98) 小键盘3: VK_NUMPAD0 (99) 小键盘4: VK_NUMPAD0 (100) 小键盘5: VK_NUMPAD0 (101) 小键盘6: VK_NUMPAD0 (102) 小键盘7: VK_NUMPAD0 (103) 小键盘8: VK_NUMPAD0 (104) 小键盘9: VK_NUMPAD0 (105) 小键盘.: VK_DECIMAL (110)

modbus 协议 及 modbus RTU 的 C51 单片机 程序

modbus 协议及modbus RTU 的C51 单片机程序 Modbus通讯协议 Modbus协议最初由Modicon公司开发出来,在1979年末该公司成为施耐德自动化(Schneider Automation)部门的一部分,现在Modbus已经是工业领域全球最流行的协议。此协议支持传统的RS-232、RS-422、RS-485和以太网设备。许多工业设备,包括PLC,DCS,智能仪表等都在使用Modbus协议作为他们之间的通讯标准。有了它,不同厂商生产的控制设备可以连成工业网络,进行集中监控。 当在网络上通信时,Modbus协议决定了每个控制器须要知道它们的设备地址,识别按地址发来的消息,决定要产生何种行动。如果需要回应,控制器将生成应答并使用Modbus协议发送给询问方。 Modbus 协议包括ASCII、RTU、TCP等,并没有规定物理层。此协议定义了控制器能够认识和使用的消息结构,而不管它们是经过何种网络进行通信的。标准的Modicon控制器使用RS232C实现串行的Modbus。Modbus的ASCII、RTU协议规定了消息、数据的结构、命令和就答的方式,数据通讯采用Maser/Slave方式,Master端发出数据请求消息,Slave端接收到正确消息后就可以发送数据到Master端以响应请求;Master端也可以直接发消息修改Slave端的数据,实现双向读写。 Modbus 协议需要对数据进行校验,串行协议中除有奇偶校验外,ASCII模式采用LRC校验,RTU模式采用16位CRC校验,但TCP模式没有额外规定校验,因为TCP协议是一个面向连接的可靠协议。另外,Modbus采用主从方式定时收发数据,在实际使用中如果某Slave 站点断开后(如故障或关机),Master端可以诊断出来,而当故障修复后,网络又可自动接通。因此,Modbus协议的可靠性较好。 下面我来简单的给大家介绍一下,对于Modbus的ASCII、RTU和TCP协议来说,其中TCP 和RTU协议非常类似,我们只要把RTU协议的两个字节的校验码去掉,然后在RTU协议的开始加上5个0和一个6并通过TCP/IP网络协议发送出去即可。所以在这里我仅介绍一下Modbus的ASCII和RTU协议。 下表是ASCII协议和RTU协议进行的比较: 协议 开始标记 结束标记

51串口通信协议(新型篇)

51串口通信协议(新型篇) C51编程:这是网友牛毅编的一个C51串口通讯程序! //PC读MCU指令结构:(中断方式,ASCII码表示) //帧:帧头标志|帧类型|器件地址|启始地址|长度n|效验和|帧尾标志 //值: 'n' 'y'| 'r' | 0x01 | x | x | x |0x13 0x10 //字节数: 2 | 1 | 1 | 1 | 1 | 1 | 2 //求和: ///////////////////////////////////////////////////////////////////// //公司名称:*** //模块名:protocol.c //创建者:牛毅 //修改者: //功能描述:中断方式:本程序为mcu的串口通讯提供(贞结构)函数接口,包括具体协议部分 //其他说明:只提供对A T89c51具体硬件的可靠访问接口 //版本:1.0 //信息:QQ 75011221 ///////////////////////////////////////////////////////////////////// #include #include //预定义 //帧 #define F_ST1 0x6e //帧头标志n #define F_ST2 0x79 //帧头标志y #define F_R 0x72 //帧类型读r #define F_W 0x77 //帧类型写w #define F_D 0x64 //帧类型数据帧d #define F_B 0x62 //帧类型写回应帧b #define F_C 0x63 //帧类型重发命令帧c #define F_Q 0x71 //帧类型放弃帧q #define F_ADDR 0x31 //器件地址0-9 #define F_END 0x7a //帧尾标志z #define F_SPACE 0x30 //空标志0 #define F_ERR1 0x31 //错误标志1,flagerr 1 #define F_ERR2 0x32 //错误标志2 2 //常数 #define S_MAXBUF 16 //接收/发送数据的最大缓存量 #define FIELD_MAXBUF 48 //最小场缓存,可以大于48字节,因为协议是以20字节为

ASCII码对照表 -

ASCII码对照表 ASCII码对照表 ASCII, American Standard Code for Information Interchange 念起来像是 "阿斯key",定义从 0 到 127 的一百二十八个数字所代表的英文字母或一样的结果与 意义。由于只使用7个位元(bit)就可以表示从0到127的数字,大部分的电脑都使 用8个位元来存取字元集(character set),所以从128到255之间的数字可以用来代 表另一组一百二十八个符号,称为 extended ASCII。 ASCII码键盘ASCII 码键盘ASCII码键盘ASCII 码键盘 27ESC32SPACE33!34" 35#36$37%38& 39'40(41)42* 43+44'45-46. 47/480491502 513524535546 55756857958: 59;60<61=62> 63?64@65A66B 67C68D69E70F 71G72H73I74J 75K76L77M78N 79O80P81Q82R 83S84T85U86V 87W88X89Y90Z 91[92\93]94^ 95_96`97a98b 99c100d101e102f 103g104h105i106j 107k108l109m110n 111o112p113q114r 115s116t117u118v 119w120x121y122z 123{124|125}126~ 目前计算机中用得最广泛的字符集及其编码,是由美国国家标准局(ANSI)制定的ASCII码 (American Standard Code for Information Interchange,美国标准信息交换码),它已被国际标准化组织(ISO)定为国际标准,称为ISO 646标准。适用于所有拉丁文字字母,ASCII码有7位码和8位码两种形式。 因为1位二进制数可以表示(21=)2种状态:0、1;而2位二进制数可以表示(22)=4种状态:00、01、10、11;依次类推,7位二进制数可以表示(27=)128种状态,每种状态都唯一地编为一个7位的二进制码,对应一个字符(或控制码),这些码可以排列成一个十进制序号0~127。所以,7位ASCII码是用七位二进制数进行编码的,可以表示128个字符。

十二.PC 机与单片机通信(RS232 协议)

十二.PC 机与单片机通信(RS232 协议) [实验任务] 单片机串口通信的应用,通过串口,我们的个人电脑和单片机系统进行通信。个人电脑作为上位机,向下位机单片机系统发送十六进制或者ASCLL码,单片机 系统接收后,用LED显示接收到的数据和向上位机发回原样数据。 [硬件电路图] [实验原理] RS-232是美国电子工业协会正式公布的串行总线标准,也是目前最常用的串 行接口标准,用来实现计算机与计算机之间、计算机与外设之间的数据通讯。RS-232串行接口总线适用于:设备之间的通讯距离不大于15m,传输速率最大为 20kBps。RS-232协议以-5V-15V表示逻辑1;以+5V-15V 表示逻辑0。我们是 用MAX232芯片将RS232电平转换为TTL电平的。一个完整的RS-232接口有22 根线,采用标准的25芯插头座。我们在这里使用的是简化的9芯插头座。 注意我们在这里使用的晶振是11.0592M的,而不是12M。因为波特率的设置 需要11.0592M的。 “串口调试助手V2.1.exe”软件的使用很简单,只要将串口选择‘CMO1’波特率设置为‘9600’数据位为8 位。打开串口(如果关闭)。然后在发送区里输入要发送的数据,单击手动发送就将数据发送出去了。注意,如果选中‘十六进制发送’那么发送的数据是十六进制的,必须输入两位数据。如果没有选中, 数字二进制Px0~Px7 Abcdefg p 十六进制 0 00111111 00000011 11111100 0xco 1 00000110 10011111 01100000 0xf9

[C语言源程序] #include "reg52.h" //包函8051 内部资源的定义 unsigned char dat; //用于存储单片机接收发送缓冲寄存器SBUF里面的内容 sbit gewei=P2^6; //个位选通定义 sbit shiwei=P2^5; //十位选通定义 sbit baiwei=P2^4; unsigned char code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1, 0x86,0x8e,0x40,}; void Delay(unsigned int tc) //延时程序 { while( tc != 0 ) {unsigned int i; for(i=0; i<100; i++); tc--;} } void LED() //LED显示接收到的数据(十进制) { shiwei=0; P0=table[dat/10]; Delay(10); shiwei=1; gewei=0; P0=table[dat%10]; Delay(10); gewei=1; baiwei=0; P0=table[dat/100]; Delay(10); baiwei=1; } ///////功能:串口初始化,波特率9600,方式1///////// void Init_Com(void) { TMOD = 0x20; PCON = 0x00; SCON = 0x50; TH1 = 0xFd;

通用单片机通讯协议ascii

组态王与单片机协议 1.通讯口设置: 通讯方式:RS-232,RS-485,RS-422均可。 波特率:由单片机决定(2400,4800,9600and19200bps)。 字节数据格式:由单片机决定。 注意:在组态王中设置的通讯参数如波特率,数据位,停止位,奇偶校验必须与单片机编程中的通讯参数一致 2.在组态王中定义设备地址的格式 格式:##.# 前面的两个字符是设备地址,范围为0-255,此地址为单片机的地址,由单片机中的程序决定; 后面的一个字符是用户设定是否打包,“0”为不打包、“1”为打包,用户一旦在定义设备时确定了打包,组态王将处理读下位机变量时数据打包的工作。 3.在组态王中定义的寄存器格式 注意:在组态王中定义变量时,一个X寄存器根据所选数据类型(BYTE,UINT,FLOAT)的不同分别占用一个、两个,四个字节,定义不同的数据类型要注意寄存器后面的地址,同一数据区内不可交叉定义不同数据类型的变量。为提高通讯速度建议用户使用连续的数据区。 例如, 1、在单片机中定义从地址0开始的数据类型为BYTE型的变量: 则在组态王中定义相应的变量的寄存器为X0、X1、X2、X3、X4。。。。。。。。,数据类型为BYTE,每个变量占一个字节 2、在单片机中定义从地址100开始的数据类型为UINT型的变量: 则在组态王中定义相应的变量的寄存器为X100、X102、X104、X106、X108。。。。。。。。,数据类型UINT,每个变量占两个字节

3、在单片机中定义从地址200开始的数据类型为FLOAT 型的变量: 则在组态王中定义相应的变量的寄存器为X200、X20 4、X208、X212。。。。。。。, 数据类型FLOAT ,每个变量占四个字节 3.组态王与单片机通讯的命令格式: 字头:1字节1个ASCII 码,40H 设备地址: 1字节2个ASCII 码,0—255(即0---0x0ffH ) 标志:1字节2个ASCII 码,bit0~bit7, bit0= 0:读,bit0= 1:写。 bit1= 0:不打包。 bit3bit2 = 00,数据类型为字节。 bit3bit2 = 01,数据类型为字。 bit3bit2 = 1x,数据类型为浮点数。 数据地址: 2字节4个ASCII 码,0x0000~0xffff 数据字节数:1字节2个ASCII 码,1—100,实际读写的数据的字节数。 数据…:为实际的数据转换为ASCII 码,个数为字节数乘2。 异或:异或从设备地址到异或字节前,异或值转换成2个ASCII 码 CR :0x0d 。 通讯尝试恢复命令(COMERROR ),请求地址为0的一个BYTE 数据 3.1.上位机发送读命令 下位机应答:若正常: 若不正常: 100,数据类型为字节,不打包。组态王所 若正确:

ASCII码对照表完整版

A S C I I码对照表完整版 Revised final draft November 26, 2020

好用的A S C I I码对照表完整版 信息在计算机上是用二进制表示的,这种表示法让人理解就很困难。因此计算 机上都配有输入和输出设备,这些设备的主要目的就是,以一种人类可阅读的形式 将信息在这些设备上显示出来供人阅读理解。为保证人类和设备,设备和计算机之 间能进行正确的信息交换,人们编制的统一的信息交换代码,这就是ASCII码表,

在Web开发时,如下的ASCII码只要加上&#和;就可以变成Web可以辨认的字符了在处理特殊字符的时候特别有用,如:'单引号在数据库查询的时候是杀手,但是如果转换成'(注意:转换后的机构有:&#+字符的ASCII码值+;三个部分组成)再来存数据库,就没有什么影响了。其他的字符与ASCII码的对照如下表 ASCII表

键盘常用ASCII码 ESC键VK_ESCAPE(27)回车键:VK_RETURN(13)TAB键:VK_TAB(9)CapsLock键: VK_CAPITAL(20)Shift键:VK_SHIFT($10)Ctrl键:VK_CONTROL(17)Alt键: VK_MENU(18)空格键:VK_SPACE($20/32)退格键:VK_BACK(8)左徽标键:VK_LWIN(91)右徽标键:VK_LWIN(92)鼠标右键快捷键:VK_APPS(93) Insert键:VK_INSERT(45)Home键:VK_HOME(36)PageUp:VK_PRIOR(33)PageDown:VK_NEXT(34)End键:VK_END(35)Delete键:VK_DELETE(46) 方向键(←):VK_LEFT(37)方向键(↑):VK_UP(38)方向键(→):VK_RIGHT(39)方向键(↓):VK_DOWN(40) F1键:VK_F1(112)F2键:VK_F2(113)F3键:VK_F3(114)F4键:VK_F4(115)F5键:

最全ASCII码对照表

最全ASCII码对照表 Bin Dec Hex 缩写/字符解释 0000 0000 0 00 NUL (null) 空字符0000 0001 1 01 SOH (start of handing) 标题开始0000 0010 2 02 STX (start of text) 正文开始0000 0011 3 03 ETX (end of text) 正文结束0000 0100 4 04 EOT (end of transmission) 传输结束0000 0101 5 05 ENQ (enquiry) 请求 0000 0110 6 06 ACK (acknowledge) 收到通知0000 0111 7 07 BEL (bell) 响铃 0000 1000 8 08 BS (backspace) 退格 0000 1001 9 09 HT (horizontal tab) 水平制表符0000 1010 10 0A LF (NL line feed, new line) 换行键 0000 1011 11 0B VT (vertical tab) 垂直制表符0000 1100 12 0C FF (NP form feed, new page) 换页键 0000 1101 13 0D CR (carriage return) 回车键0000 1110 14 0E SO (shift out) 不用切换0000 1111 15 0F SI (shift in) 启用切换0001 0000 16 10 DLE (data link escape) 数据链路转义0001 0001 17 11 DC1 (device control 1) 设备控制1 0001 0010 18 12 DC2 (device control 2) 设备控制2 0001 0011 19 13 DC3 (device control 3) 设备控制3 0001 0100 20 14 DC4 (device control 4) 设备控制4 0001 0101 21 15 NAK (negative acknowledge) 拒绝接收0001 0110 22 16 SYN (synchronous idle) 同步空闲0001 0111 23 17 ETB (end of trans. block) 传输块结束0001 1000 24 18 CAN (cancel) 取消 0001 1001 25 19 EM (end of medium) 介质中断0001 1010 26 1A SUB (substitute) 替补 0001 1011 27 1B ESC (escape) 溢出 0001 1100 28 1C FS (file separator) 文件分割符0001 1101 29 1D GS (group separator) 分组符0001 1110 30 1E RS (record separator) 记录分离符0001 1111 31 1F US (unit separator) 单元分隔符 0010 0000 32 20 空格 0010 0001 33 21 ! 0010 0010 34 22 " 0010 0011 35 23 # 0010 0100 36 24 $ 0010 0101 37 25 % 0010 0110 38 26 & 0010 0111 39 27 "

(合同制定方法)单片机与上位机通信协议的制定

(合同制定方法)单片机与上位机通信协议的制定

单片机和上位机通信协议的制定 单片机和上位机的串口通信协议分为上行协议和下行协议,要分别制定!上行协议,即由单片机向上位机发送数据。 下行协议,即由上位机向单片机发送数据。 而通信协议又要分固定长度和不定长度俩种 本文所介绍的协议属于简单的固定字长的通信协议! 下行协议由四个字节构成

上表是简单的上位机对单片机的控制指令 下述函数是C#中封装的串口通信类中的发送函数的封装publicvoidSerSendCommu(byteorderDef,bytedata)//参数1为命令字,参数二为要发送的数 //据,需要时可直接调用 { Byte[]BSendTemp=newByte[SEND_LENTH]; BSendTemp[0]=PRE; BSendTemp[1]=orderDef; BSendTemp[2]=data; BSendTemp[3]=END; this.serialPort1.Write(BSendTemp,0,SEND_LENTH); } 下位机中用中断方式接收字符,本文用的是GCC语言,下面是串口接收数据中断 ISR(USART_RXC_vect)//串口接收中断

{ unsignedcharstatus,data; status=UCSRA;//**首先读取UCSRA的值,再读取UDR值,顺序不能颠倒,否则读取UDR后的UCSRA的 //值即会改变** data=UDR; if(!Uart_RecvFlag)//判断缓存中的数据是否读完,读完则接收指令 { if((status&((1<

基于普通单片机的LIN协议实现方案

1 概述 LIN协议是新出现的一种新型低成本串行通信总线,其全称是Local Interconnect Network,即局部互联网络。它最开始出现于汽车行业,是为解决汽车智能化和网络化的发展要求和降低汽车制造成本的 矛盾而提出来的一种串行总线协议,主要用于车门、车灯等需要简单 控制但又要求智能控制的场合。它的主要特点是:采用单个主控制器 /多从设备通信模式;基于普通UART/SCI接口硬件实现,协议简单;网络传输速率不高,最高可达20kb/s。由于LIN协议的突出特点是协议对硬件的依赖程度低,可以基于普通单片机的通用串口等硬件资源 以软件方式实现,成本低廉,因此可广泛应用于汽车行业以外的其他 领域,如智能家庭网络内部的数据传输、节点控制等场合。 本文依据对LIN协议的分析,对其协议在普通单片机上的具体实现,即如何利用单片机有限的硬件资源实现LIN的主节点、从节点, 进行可行性方案的研究、探讨。 2 LIN协议的简介 LIN协议的最新版本是LIN Specification Package Revision 2.O,包 括协议规范、节点诊断配置规范、物理层规范、API规范等几个方面,从硬件配置到节点配置语言都作了详细的规定。下面就其协议规范作 一简要介绍和分析。 LIN的数据传输是采用报文帧的形式进行的。一个完整的报文帧 由1个主机节点发送的报文头(header)和1个主机或从机节点发送的响 应(response)组成,如图1所示。报文头包括1个间隔场(break)、1个同步字节场(synch)和1个保护标识符字节场PID(Protected IDentifier)。间 隔场是由持续了至少13个位时的显性电平和至少1个位时的隐性电平 组成;由主机节点产生,标志着一次数据通信过程报文帧的开始。同 步字节场包含时钟同步信息。同步字节场的格式是0x55,表现在8个 位定时中有5个下降沿,即隐性跳变到显性的边沿。

关于51单片机上实现modbus协议

关于51单片机上实现modbus协议 你找一个MODBUS的协议详细资料好好看看,就是一种通讯约定,你按照它规定的格式通讯就可以了 协议发送给询问方。Modbus协议包括ASCII、RTU、TCP等,并没有规定物理层。此协议定义了控制器能够认识和使用的消息结构,而不管它们是经过何种网络进行通信的。标准的Modicon控制器使用RS232C实现串行的Modbus。 Modbus的ASCII、RTU协议规定了消息、数据的结构、命令和就答的方式,数据通讯采用Maser/Slave方式,Master端发出数据请求消息,Slave端接收到正确消息后就可以发送数据到Master端以响应请求;Master端也可以直接发消息修改Slave端的数据,实现双向读写。Modbus协议需要对数据进行校验,串行协议中除有奇偶校验外,ASCII模式采用LRC 校验,RTU模式采用16位CRC校验,但TCP模式没有额外规定校验,因为TCP协议是一个面向连接的可靠协议。另外,Modbus采用主从方式定时收发数据,在实际使用中如果某Slave站点断开后(如故障或关机),Master端可以诊断出来,而当故障修复后,网络又可自动接通。因此,Modbus协议的可靠性较好。下面我来简单的给大家介绍一下,对于Modbus的ASCII、RTU和TCP协议来说,其中TCP和RTU协议非常类似,我们只要把RTU协议的两个字节的校验码去掉,然后在RTU协议的开始加上5个0和一个6并通过TCP/IP网络协议发送出去即可。所以在这里我仅介绍一下Modbus的ASCII和RTU协议。下表是ASCII协议和RTU协议进行的比较:协议开始标记结束标记校验传输效率程序处理 ASCII :(冒号)CR,LF LRC 低直观,简单,易调试 RTU 无无CRC 高不直观,稍复杂 通过比较可以看到,ASCII协议和RTU协议相比拥有开始和结束标记,因此在进行程序处理时能更加方便,而且由于传输的都是可见的ASCII字符,所以进行调试时就更加的直观,另外它的LRC校验也比较容易。但是因为它传输的都是可见的ASCII字符,RTU传输的数据每一个字节ASCII都要用两个字节来传输,比如RTU传输一个十六进制数0xF9,ASCII 就需要传输’F’’9’的ASCII码0x39和0x46两个字节,这样它的传输的效率就比较低。所以一般来说,如果所需要传输的数据量较小可以考虑使用ASCII协议,如果所需传输的数据量比较大,最好能使用RTU协议。 下面对两种协议的校验进行一下介绍。 1、LRC校验 LRC域是一个包含一个8位二进制值的字节。LRC值由传输设备来计算并放到消息帧中,接收设备在接收消息的过程中计算LRC,并将它和接收到消息中LRC域中的值比较,如果两值不等,说明有错误。

单片机与PC机通信协议(RS232)

帧格式如下: 其中LB、DS在命令帧和应答帧中无。 差错控制与校验采用纵向冗余校验(LRC)。 发送方校验和生成方法: 将FD、LB、DS域逐个字节相加求和,在求和过程中舍弃进位,最后将所得的和(单个字节)取补码作为检验和(CS)。 生成校验和的函数为: static unsigned char LRC(auchMsg,usDataLen) /* 函数返回unsigned char 类型的LRC 结果*/ unsigned char *auchMsg ; /* 要计算LRC 的报文*/ unsigned short usDataLen ; /* 报文的字节数*/ { unsigned char uchLRC = 0 ; /* LRC 初始化*/ while (usDataLen--) /* 完成整个报文缓冲区*/ uchLRC += *auchMsg++ ; /* 缓冲区字节相加,无进位*/ return ((unsigned char)(-((char)uchLRC))) ; /* 返回二进制补码*/ } 接收方校验方法: 将所有接收到的数据,即FD、LB、DS、CS等域逐个字节相加求和,在求和过程中舍弃进位,若结果为零(低字节)则传输无错,否则出错。 应答: 接收方对接收数据进行校验后,若无错则向发送方发送传输无错应答帧,若有错则向发送方发送传输出错应答帧。 所需通信数据分为:数据帧、命令帧、应答帧 上行数据:下位机(单片机)向上位机(PC机)传送数据 ⑴初始化上位机(IPC):FD=0x01 (InitPC) 单片机将电梯模拟器的参数发送至PC机,初始化PC机端的可视化程序。PC机上的可视化程序完成初始化后,应向单片机发送初始化完毕命令。 帧格式:

51单片机通信协议

单片机通信协议 现在大部分的仪器设备都要求能过通过上位机软件来操作,这样方便调试,利于操作。其中就涉及到通信的过程。在实际制作的几个设备中,笔者总结出了通信程序的通用写法,包括上位机端和下位机端等。 1.自定义数据通信协议 这里所说的数据协议是建立在物理层之上的通信数据包格式。所谓通信的物理层就是指我们通常所用到的RS232、RS485、红外、光纤、无线等等通信方式。在这个层面上,底层软件提供两个基本的操作函数:发送一个字节数据、接收一个字节数据。所有的数据协议全部建立在这两个操作方法之上。 通信中的数据往往以数据包的形式进行传送的,我们把这样的一个数据包称作为一帧数据。类似于网络通信中的TCPIP协议一般,比较可靠的通信协议往往包含有以下几个组成部分:帧头、地址信息、数据类型、数据长度、数据块、校验码、帧尾。 帧头和帧尾用于数据包完整性的判别,通常选择一定长度的固定字节组成,要求是在整个数据链中判别数据包的误码率越低越好。减小固定字节数据的匹配机会,也就是说使帧头和帧尾的特征字节在整个数据链中能够匹配的机会最小。通常有两种做法,一、减小特征字节的匹配几率。二、增加特征字节的长度。通常选取第一种方法的情况是整个数据链路中的数据不具有随即性,数据可预测,可以通过人为选择帧头和帧尾的特征字来避开,从而减小特征字节的匹配几率。使用第二种方法的情况更加通用,适合于数据随即的场合。通过增加特征字节的长度减小匹配几率,虽然不能够完全的避免匹配的情况,但可以使匹配几率大大减小,如果碰到匹配的情况也可以由校验码来进行检测,因此这种情况在绝大多说情况下比较可靠。 地址信息主要用于多机通信中,通过地址信息的不同来识别不同的通信终端。在一对多的通信系统中,可以只包含目的地址信息。同时包含源地址和目的地址则适用于多对多的通信系统。 数据类型、数据长度和数据块是主要的数据部分。数据类型可以标识后面紧接着的是命令还是数据。数据长度用于指示有效数据的个数。 校验码则用来检验数据的完整性和正确性。通常对数据类型、数据长度和数据块三个部分进行相关的运算得到。最简单的做法可是对数据段作累加和,复杂的也可以对数据进行CRC运算等等,可以根据运算速度、容错度等要求来选取。 2.上位机和下位机中的数据发送 物理通信层中提供了两个基本的操作函数,发送一个字节数据则为数据发送的基础。数据包的发送即把数据包中的左右字节按照顺序一个一个的发送数据而已。当然发送的方法也有不同。 在单片机系统中,比较常用的方法是直接调用串口发送单个字节数据的函数。这种方法的缺点是需要处理器在发送过程中全程参与,优点是所要发送的数据能够立即的出现在通信线路上,能够立即被接收端接收到。另外一种方法是采用中断发送的方式,所有需要发送的数据被送入一个缓冲区,利用发送中断将缓冲区中的数据发送出去。这种方法的优点是占用处理器资源小,但是可能出现需要发送的数据不能立即被发送的情况,不过这种时延相当的小。对于51系列单片机,比较倾向于采用直接发送的方式,采用中断发送的方式比较占用RAM资源,而且对比直接发送来说也没有太多的优点。以下是51系列单片机中发送单个字节的函数。 v oid SendBy te(unsigned char ch) { SBUF = ch; while(TI == 0); TI = 0; }

ASCII码对照表完整版

好用的A S C I I码对照表完整版 信息在计算机上是用二进制表示的,这种表示法让人理解就很困难。因此计算 机上都配有输入和输出设备,这些设备的主要目的就是,以一种人类可阅读的形式 将信息在这些设备上显示出来供人阅读理解。为保证人类和设备,设备和计算机之 间能进行正确的信息交换,人们编制的统一的信息交换代码,这就是ASCII码表,

在Web开发时,如下的ASCII码只要加上&#和;就可以变成Web可以辨认的字符了在处理特殊字符的时候特别有用,如:'单引号在数据库查询的时候是杀手,但是如果转换成'(注意:转换后的机构有:&#+字符的ASCII码值+;三个部分组成)再来存数据库,就没有什么影响了。其他的字符与ASCII码的对照如下表 ASCII表

键盘常用ASCII码 ESC键VK_ESCAPE(27) 回车键:VK_RETURN(13) TAB键:VK_TAB(9) CapsLock键:VK_CAPITAL(20) Shift键:VK_SHIFT($10) Ctrl键:VK_CONTROL(17) Alt键:VK_MENU(18) 空格键:VK_SPACE($20/32) 退格键:VK_BACK(8) 左徽标键:VK_LWIN(91) 右徽标键:VK_LWIN(92) 鼠标右键快捷键:VK_APPS(93) Insert键:VK_INSERT(45)

Home键:VK_HOME(36) PageUp:VK_PRIOR(33) PageDown:VK_NEXT(34) End键:VK_END(35) Delete键:VK_DELETE(46) 方向键(←):VK_LEFT(37) 方向键(↑):VK_UP(38) 方向键(→):VK_RIGHT(39) 方向键(↓):VK_DOWN(40) F1键:VK_F1(112) F2键:VK_F2(113) F3键:VK_F3(114) F4键:VK_F4(115) F5键:VK_F5(116) F6键:VK_F6(117) F7键:VK_F7(118) F8键:VK_F8(119) F9键:VK_F9(120) F10键:VK_F10(121) F11键:VK_F11(122) F12键:VK_F12(123) NumLock键:VK_NUMLOCK(144) 小键盘0:VK_NUMPAD0(96) 小键盘1:VK_NUMPAD0(97) 小键盘2:VK_NUMPAD0(98)

相关主题