串行通信协议

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

通信方式 :异步通信
工作方式 :1
波特率 :9600
奇偶校验 :无
帧数据位数:10
包定义:
描述:采用定长包。
大小:8字节 #define PACKETSIZE 8

单片机程序用:comm.c(使用232通信)、COMM04.C(使用485通信)、【COMM04gai.C(使用485通信)协议不完全一样?】

下面例子可用TSerial.exe或PortTest.exe或sscom32T.exe或具有脚本功能的端口调试.exe串口程序软件来调试均可,其中数值中未注明的为10进制数

1、日期时间同步
单片机接收到 :0XFE FF 00 05 30 10 15 0XFF 为广播设置(FF)机器日期时间:5月30日10时15分(HEX序列为FE FF 00 05 1E 0A 0F FF即FEFF00051E0A0FFF ),对所有联网设备,不要求返回信息,单片机侧显示||000。

2、查询机器及状态
单片机接收到 :0XFE 04 04 - -- -- -- 0XFF 为查询机器及状态,例FE 04 04 00 00 00 00 FF即FE040400000000FF
单片机发送给PC:0XFE 04 04 00 -- -- -- 0XFF 单片机返回:机器号4及状态好,单片机侧显示44444。
单片机发送给PC:0XFE 04 04 01 -- -- -- 0XFF 单片机返回:机器号4及状态异常,单片机侧显示44444。

3、读24C02全部内容
单片机接收到 :0XFE 04 02 02 -- -- 00 0XFF 为读24C02全部内容,例FE 04 02 02 00 00 00 FF即FE040202000000FF
单片机发送给PC:0XFE 04 03 02 nn -- dd 0XFF 单片机依次返回24C02 nn(从0~256)单元全部内容dd,单片机侧显示-----或--222。

4、读24C02指定0N单元内容
单片机接收到 :0XFE 04 02 02 0N -- 01 0XFF 为读24C02中0N单元内容,例FE 04 02 02 00 11 01 FF为读24C02中00单元内容即FE040202001101FF
单片机发送给PC:0XFE 04 03 02 0N -- dd 0XFF 单片机返回24C02中0N单元内容,单片机侧显示-----或--222。

5、读XRAM中MM00页内容
单片机接收到 :0XFE 04 02 03 -- MM 00 0XFF 为读XRAM中MM00页从0~256单元全部内容,例如:FE 04 02 03 00 F0 00 FF 为读XRAM中F000~F0FF单元全部内容
单片机发送给PC:0XFE 04 03 03 0n MM dd 0XFF 单片机返回XRAM中MM00页从0~256单元全部内容,单片机侧显示-----或--222。

6、写24C02中0N单元的数据
单片机接收到 :0XFE 04 03 02 0N -- dd 0XFF 为写24C02中0N单元的数据,例FE 04 03 02 0A 14 66 FF为写24C02中0A单元的数据66即FE0403020A1466FF
单片机发送给PC:0XFE 04 01 02 0N -- dd 0XFF 单片机返回24C02中0N单元的数据,并显示操作.单元.数据:1 0A 66(应比较有无写正确)

7、写XRAM中MMNN单元的数据
单片机接收到 :0XFE 04 03 03 NN MM dd 0XFF 为写XRAM中MMNN单元的数据,例FE 04 03 03 0A F0 66 FF为写XRAM中F00A单元的数据66
单片机发送给PC:0XFE 04 01 03 NN MM dd 0XFF 单片机返回XRAM中0M单元的数据,并显示:--333(

应比较有无写正确)

单片机接收到数据就有显示:设备号设备号命令号命令号命令号如44222,代表设备号为4,命令号为2。

包格式:|包首|数据|包尾|
数据:同步:|机器号(1字节)|命令类型(1字节)| 月(1字节) |日(1字节)|时(1字节)| 分(1字节) |
读:|机器号(1字节)|命令类型(1字节)|对象类型(1字节)| 单元页地址(2字节) |控制个数(1字节)|
写:|机器号(1字节)|命令类型(1字节)|对象类型(1字节)| 单元页地址(2字节) | 数据(1字节) |
查询:|机器号(1字节)|命令类型(1字节)| 空(1字节) |空(1字节)|空(1字节)| 空(1字节) |
接收进单片机:packetBuffer[]
packetBuffer[0]=0XFE,包首标识
packetBuffer[1]=MACHINENUMBER或0xFF(广播),机器号(1字节):04为机器号4,FF为广播设置(对所有设备)
packetBuffer[2],ORDERBYTE=2,命令类型(1字节):
#define SETTIME 0,为日期时间同步, 格式为FE MACHINENUMBER 00 月 日 时 分 FF
#define OPERATIONRESULT 1,为返回操作指示。
#define READ 2,读24C02或XRAM内容,格式为FE MACHINENUMBER 02 OBJECTBYTE 单元 页 控制 FF,返回SPacket
#define WRITE 3,写24C02或XRAM内容,格式为FE MACHINENUMBER 03 OBJECTBYTE 单元 页 数据 FF,返回packetBuffer
#define STATE 4,查询机器及状态, 格式为FE MACHINENUMBER 04 - - - - FF,返回SPacket,格式为FE MACHINENUMBER 04 00 00 00 00 FF则正常,格式为FE MACHINENUMBER 04 01 00 00 00 FF为异常
packetBuffer[3]=月;OBJECTBYTE:02为24C02,03为XRAM;
packetBuffer[4]=日;单元;
packetBuffer[5]=时;页;
packetBuffer[6]=分;控制:0为全部,非0为指定;数据
packetBuffer[7]=0XFF,包尾标识

发送给PC:Spacket[]
Spacket[0]=0XFE,包首标识
Spacket[1]=MACHINENUMBER
Spacket[2]=ORDERBYTE=2,命令类型。收到查询返回查询,收到读返回写,收到写返回操作
Spacket[3]=查询返回00为正常,01为异常;OBJECTBYTE:02为24C02,03为XRAM
Spacket[4]=单元序号
Spacket[5]=页
Spacket[6]=数据
Spacket[7]=0XFF,包尾标识


SBUF:串行口缓冲寄存器.
SCON:串行口控制寄存器.
PCON:电源控制寄存器.
REN:接收允许置1;
RI,TI:硬件置1,软件清0。

串口初始化函数:
{
SCON;
TMOD;
PCON;
TH1;
开所有中断;
开串行中断;
启动Timer1;
}

串口中断服务函数:
{
禁止所有中断;
RI清零;

将SBUF中数据读入包缓冲区;
计数器加1;
如果计数器值等于包大小,
包接收状态值1;
计数器置0;

允许所有中断;
}
键处理函数
Key1()
{
}
...
Key4()
{
}
void Init(void);
void InitSerialComm(void);
命令接收:
命令识别函数:
命令处理函数:
读命令处理函数:ODRead();
写命令处理函数:ODWrite();
包定义:


struct Packet
{

BYTE head;
BYTE Order;
WORD Object;
WORD Address;
BYTE Data;
BYTE end;
};
read(1) 对象(24c02) 地址
write(0) 对象 地址 数据
变量:cObject,cOrder,iAddress,cDataLength,cData
包接收:
1、当收到“包首标识”认为是包首,开始接收;
2、获取数据长度,字节计数器开始计数;
3、获取命令类型
结束否?
4、获取对象标识
5、获取起始地址
6、获取个数
7、获取数据
结束否?
收完包后,置字节计数器为0,检验包尾字节是否等于“包尾标识”,
等于则置‘包接收完毕标志’为‘1’;
不等则继续。
模块:
主窗口
24c02
256个单元的表格
16进制
读所有单元按钮
写所有单元按钮
1个单元的数据被更改,如果更改后数据与更改前数据不同,则将此数据写 入芯片。
串口读写
以包为读写单元。
串口初始化
接口:读函数
接口:写函数
读缓存
写缓存
class Comm
{
public:
InitComm(void)
bool Read(BYTE buffer);
Write(data[6]);
protected:
BYTE ReadBuffer[10];
BOOL bPacketFlag[10];
}

InitComm(void)
{
hComm = CreateFile("COM1",GENERIC_READ | GENERIC_WRITE,
0,0,OPEN_EXISTING,0,0);
if(hComm == INVALID_HANDLE_VALUE)
{
ShowMessage("找不到串口或串口被占用!");
return;
}
GetCommTimeouts(hComm,&ctmoOld);
ctmoNew.ReadTotalTimeoutConstant = 100;
ctmoNew.ReadTotalTimeoutMultiplier = 0;
ctmoNew.WriteTotalTimeoutMultiplier = 0;
ctmoNew.WriteTotalTimeoutConstant = 0;
SetCommTimeouts(hComm, &ctmoNew);
dcbCommPort.DCBlength = sizeof(DCB);
GetCommState(hComm, &dcbCommPort);
BuildCommDCB("9600,N,8,1", &dcbCommPort);
SetCommState(hComm, &dcbCommPort);
}

void Run()
{
while(1)
{
if(bPacketFlag)
{
nextBuffer;
}
else
{
CurrentBuffer;
}
w();
}
}

bool Read(buffer)
{
if(bPacketFlag)
{
buffer = readBuffer;
bPacketFlag = False;
return True;
}
else return False;
}

Write(data[6])
{
Packet[0] = 0;

Packet[7] = 1;
for(int i = 0; i< 6;i++)
{
Packet[i+1] = data [i];
}
dwBytesWrite = 8;
bSuccess = WriteFile(hComm,Packet,dwBytesWrite,&dwBytesWrite,NULL);
}

相关文档
最新文档