文档库 最新最全的文档下载
当前位置:文档库 › 通用单片机通讯协议(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×2

32~1×232

★ 数符:1位 阶符:1位

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

转换成浮点数:100.210=27?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;

}

多机通信协议规范

通信协议 来自中国工控网 所谓通信协议是指通信双方的一种约定。约定包括对数据格式、同步方式、传送速度、传送步骤、 检纠错方式以及控制字符定义等问题做出统一规定,通信双方必须共同遵守。因此,也叫做通信控制规程,或称传输控制规程,它属于ISO'S OSI七层参考模型中的数据链路层。 目前,采用的通信协议有两类:异步协议和同步协议。同步协议又有面向字符和面向比特以及面向 字节计数三种。其中,面向字节计数的同步协议主要用于DEC公司的网络体系结构中。 串行通讯简单认识 串行通讯的基本概念:与外界的信息交换称为通讯。基本的通讯方式有并行通讯和串行通讯两种。 一条信息的各位数据被同时传送的通讯方式称为并行通讯。并行通讯的特点是:各数据位同时传送,传送速度快、效率高,但有多少数据位就需多少根数据线,因此传送成本高,且只适用于近距离(相距 数米)的通讯。 一条信息的各位数据被逐位按顺序传送的通讯方式称为串行通讯。串行通讯的特点是:数据位传送,传按位顺序进行,最少只需一根传输线即可完成,成本低但送速度慢。串行通讯的距离可以从几米到几 千米。 根据信息的传送方向,串行通讯可以进一步分为单工、半双工和全双工三种。信息只能单向传送为 单工;信息能双向传送但不能同时双向传送称为半双工;信息能够同时双向传送则称为全双工。 串行通讯又分为异步通讯和同步通讯两种方式。在单片机中,主要使用异步通讯方式。 MCS_51单片机有一个全双工串行口。全双工的串行通讯只需要一根输出线和一根输入线。数据的输 出又称发送数据(TXD),数据的输入又称接收数据(RXD)。串行通讯中主要有两个技术问题,一个是数 据传送、另一个是数据转换。数据传送主要解决传送中的标准、格式及工作方式等问题。数据转换是指 数据的串并行转换。具体说,在发送端,要把并行数据转换为串行数据;而在接收端,却要把接收到的 串行数据转换为并行数据。 单工、半双工和全双工的定义 如果在通信过程的任意时刻,信息只能由一方A传到另一方B,则称为单工。 如果在任意时刻,信息既可由A传到B,又能由B传A,但只能由一个方向上的传输存在,称为半双工传输如果在任意时刻,线路上存在A到B和B到A的双向信号传输,则称为全双工。 电话线就是二线全双工信道。由于采用了回波抵消技术,双向的传输信号不致混淆不清。双工信道有时也发信道分开,采用分离的线路或频带传输相反方向的信号,如回线传输。 --------> <--------> --------> A---------B A----------B A---------B <-------- 单工半双工全双工

单片机串口通信协议程序

#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)

51单片机通信协议

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

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字节为

单片机协议

单片机通信协议 通讯参数数据传输格式数据通讯举例说明协议说明 一、通讯参数 通讯参数包括数据位,停止位,波特率、校验方式。 数据位、停止位、波特率由单片机决定。组态软件中的设定和单片机一致即可。校验方式为和校验。 二、数据传输格式 格式1、组态软件读数据命令格式: 格式2、单片机应答读数据格式(正确): 格式3、组态软件写数据命令格式: 格式4、组态软件位操作写数据命令格式: 格式5、单片机应答读数据格式 三、数据通讯举例说明 1、读数据 组态软件:发送读数据命令(格式1) 单片机:响应读数据命令 正确:返回(格式2) 2、写数据 组态软件:发送写数据命令(格式3)

组态软件:发送开关量写命令(格式4) 单片机:响应写数据命令 正确:返回(格式5) 四、协议说明 数据传输:所有数据均为16进制数 Sta: 设备地址1字节 R:读标志1字节(0x52) W:写标志1字节(0x57) B:位操作写标志1字节(0x42) DataType:需要交换的数据类型,1字节。1,字节;2,字,3,浮点型。 DataNum:要读取的数据的数量,1字节。 DataAddr:为数据偏移地址2字节,低字节在前,高字节在后。数据偏移地址以字节为单位。 Data:实际传输的数据,低字节在前,高字节在后。 DataLong: 单片机返回Data的字节数,2字节,低字节在前,高字节在后。 BitOffset:位操作写命令时,在字节中的位的偏移(0~7)。 LRC:为从第一个字节至LRC前的所有字节的异或值,1字节。 EndCode:

如果结束码EndCode为异常值,则该数据侦的数据无效。

单片机通信协议处理解析

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

十二.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码对照表 -

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个字符。

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键:

基于Modbus协议实现单片机与PLC之间的通讯

基于Modbus协议实现单片机与PLC之间的通讯 来源:PLC&FA 作者:蔡晓燕赵兴群万遂人董鹏云 关键词:可编程控制器 Modbus 通讯协议 1 引言 HMI(人机界面)以其体积小,高性能,强实时等特点,越来越多的应用于工业自动化系统和设备中。它有字母、汉字、图形和图片等不同的显示,界面简单友好。配有长寿命的薄膜按钮键盘,操作简单。它一般采用具有集成度高、速度快、高可靠且价格低等优点的单片机[1]作为其核心控制器,以实现实时快速处理。PLC和单片机结合不仅可以提PLC的数据处理能力,还可以给用户带来友好简洁的界面。本文以Modbus通讯协议为例,详细讨论了一个人机系统中,如何用C51实现单片机和PLC之间通讯的实例。 2 Modbus通讯协议[4] Modbus协议是应用于电子控制器上的一种通用语言。通过此协议,控制器相互之间、控制器经由网络和其它设备之间可以通信。 Modbus协议提供了主—从原则,即仅一设备(主设备)能初始化传输(查询)。其它设备(从设备)根据主设备查询提供的数据作出相应反应。主设备查询的格式:设备地址(或广播,此时不需要回应)、功能代码、所有要发送的数据、和一错误检测域。从设备回应消息包括确认地址、功能码、任何要返回的数据、和一错误检测域。如果在消息接收过程中发生一错误,或从设备不能执行其命令,从设备将建立一错误消息并把它作为回应发送出去。 控制器能设置为两种传输模式:ASCII和RTU,在同样的波特率下,RTU可比ASCII方式传送更多的数据,所以采用KTU模式。 (1) 典型的RTU消息帧 典型的RTU消息帧如表1所示。

RTU消息帧的地址域包含8bit。可能的从设备地址是0...127(十进制)。其中地址0是用作广播地址,以使所有的从设备都能认识。主设备通过将要联络的从设备的地址放入消息中的地址域来选通从设备。当从设备发送回应消息时,它把自己的地址放入回应的地址域中,以便主设备知道是哪一个设备作出回应。 RTU消息帧中的功能代码域包含了8bits,当消息从主设备发往从设备时,功能代码域将告之从设备需要执行哪些行为;当从设备回应时,它使用功能代码域来指示是正常回应(无误)还是有某种错误发生(称作异议回应,一般是将功能码的最高位由0改为1)。 从主设备发给从设备消息的数据域包含附加的信息:从设备必须用于进行执行由功能代 码所定义的行为。这包括了像不连续的寄存器地址,要处理项的数目,域中实际数据字节数。如果没有错误发生,从从设备返回的数据域包含请求的数据。如果有错误发生,此域包含一异议代码,主设备应用程序可以用来判断采取下一步行动。 当选用RTU模式作字符帧时,错误检测域包含一16Bits值(用两个8位的字符来实现)。错误检测域的内容是通过对消息内容进行循环冗长检测(CRC)方法得出的。CRC域附加在消息的最后,添加时先是低字节然后是高字节。 (2) 所有的Modbus功能码 Modbus的功能码定义如表2所示。

手把手教你学51单片机之十八RS485通信与Modbus协议

在工业控制、电力通讯、智能仪表等领域,通常情况下是采用串口通信的方式 进行数据交换。最初采用的方式是 RS232 接口,由于工业现场比较复杂,各 种电气设备会在环境中产生比较多的电磁干扰,会导致信号传输错误。除此之外, RS232 接口只能实现点对点通信,不具备联网功能,最大传输距离也只能达到 几十米,不能满足远距离通信要求。而 RS485 则解决了这些问题,数据信号采用 差分传输方式,可以有效的解决共模干扰问题,最大距离可以到1200 米,并且 允许多个收发设备接到同一条总线上。随着工业应用通信越来越多, 1979 年施耐 德电气制定了一个用于工业现场的总线协议 Modbus 协议,现在工业中使用 RS485 通信场合很多都采用 Modbus 协议,本节课我们要讲解一下 RS485 通信和Modbus 协议。 单单使用一块KST-51 开发板是不能够进行RS485 实验的,应很多同学的要求,把这节课作为扩展课程讲一下,如果要做本课相关实验,需要自行购买USB 转 485 通信模块。 18.1 RS485通信 实际上在 RS485 之前 RS232 就已经诞生,但是RS232 有几处不足的地方: 1、接口的信号电平值较高,达到十几V ,容易损坏接口电路的芯片,而且和TTL 电平不兼容,因此和单片机电路接起来的话必须加转换电路。 2、传输速率有局限,不可以过高,一般到几十Kb/s 就到极限了。 3、接口使用信号线和GND 与其他设备形成共地模式的通信,这种共地模式传输容易产生 干扰,并且抗干扰性能也比较弱。 4、传输距离有限,最多只能通信几十米。 5、通信的时候只能两点之间进行通信,不能够实现多机联网通信。 针对 RS232 接口的不足,就不断出现了一些新的接口标准,RS485 就是其中之一,他具备 以下的特点: 1、我们在讲A/D 的时候,讲过差分信号输入的概念,同时也介绍了差分输入的好处,最大 的优势是可以抑制共模干扰。尤其工业现场的环境比较复杂,干扰比较多,所以通信如果采用的是差分方式,就可以有效的抑制共模干扰。而RS485 就是一种差分通信方式,它的通 信线路是两根,通常用 A 和B 或者D+ 和 D- 来表示。逻辑“ 1”以两线之间的电压差为+(0.2~6)V 表示,逻辑“0”以两线间的电压差为-(0.2~6)V来表示,是一种典型的差分通信。 2、 RS485通信速度快,最大传输速度可以达到10Mb/s以上。 3、RS485 内部的物理结构,采用的是平衡驱动器和差分接收器的组合,抗干扰能力也大大 增加。 4、传输距离最远可以达到1200 米左右,但是他的传输速率和传输距离是成反比的,只有 在100Kb/s 以下的传输速度,才能达到最大的通信距离,如果需要传输更远距离可以使用中继。

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

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

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

上表是简单的上位机对单片机的控制指令 下述函数是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<

最全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 "

相关文档
相关文档 最新文档