单片机232协议中,数据包的格式和例子代码
我在项目时,须要单片机给上位机发数据包,协议是232. 现在已能发字符串了,请教大侠,怎么发数据包, 格式我知道了,希望得到例子代码,相关的也可以,,,随便问一下,单片面存储问题,没有处设存储器,我用的IC是,12S5A60S2 在此,先谢了, 也有人在问怎么发字符串啊!楼主你是怎么实现的?可以让大家参考一下嘛 本帖最后由 金砂紫钰 于 2012-9-22 14:38 编辑uchar Buf[]="wecome to nbc!\n";
//**************************************************************************************************
//延时函数
//*************************************************************************************************
void delay(uint n)
{
while (n--);
}
//**************************************************************************************************
//初始化串口
//*************************************************************************************************
void init_com( void )
{
SCON = 0x50; // 设定通信方式为方式1,允许接收,相当于REN = 1; SM1 = 1;
PCON = 0x00; //SMOD=0,该语句可去掉
IE |= 0x90 ; //打开串口中断, 相当于 EA = 1;ES = 1;
//以下4句设置T1
TMOD = 0x20; // 定时器1工作于8位自动重载模式, 用于产生波特率
TH1=0xE6; //定时器
TL1=0xE6; //TL
TR1 = 1;
}
//**************************************************************************************************
//串口发送字符
//**************************************************************************************************
void send_char( uchar ch1)
{
SBUF=ch1; //将待发数据放到SBUF
while (TI==0); //
TI=0 ; //
}
//**************************************************************************************************
//串口发送字符串
//**************************************************************************************************
void send_string(uchar *buf)
{
while (*buf != '\0')
{
send_char(*buf++);
}
}
main()
{
init_com();
while (1)
{
send_string(Buf);
delay(20000);
}
}这就是发字符串的代码,能用, LSZD 发表于 2012-9-22 12:44 static/image/common/back.gif
也有人在问怎么发字符串啊!楼主你是怎么实现的?可以让大家参考一下嘛
搞好了,你看一看吧, 本帖最后由 HeP028 于 2012-9-22 15:31 编辑
#include <REG51.H>
#include <stdio.H>
#define uchar unsigned char
#define uint unsigned int
#define ON 0
#define OFF 1
//::::::::::::::::::::::::::::::::::::::::::
sbit D0=P0^0;
sbit D1=P0^1;
sbit D2=P0^2;
sbit D3=P0^3;
sbit D4=P0^4;
sbit D5=P0^5;
sbit D6=P0^6;
sbit D7=P0^7;
//::::::::::::::::::::::::::::::::::::::::::
unsigned char Address = 'A';
unsigned char a= {0x00,0x00};
unsigned char Count = 0x00;
bit outFlag;
//::::::::::::::::::::::::::::::::::::::::::
//::::::::::::::::::::::::::::::::::::::::::
void init_serialcomm(void)
{
SCON= 0x50; //SCON: serail mode 1, 8-bit UART, enable ucvr
TMOD |= 0x20; //TMOD: timer 1, mode 2, 8-bit reload
PCON |= 0x80; //SMOD=1;
TH1 = 0xFd; //Baud:9600fosc=11.0592MHz
TL1 = 0XFD; //Baud:9600fosc=11.0592MHz
IE |= 0x90; //Enable Serial Interrupt
TR1 = 1; // timer 1 run
}
//::::::::::::::::::::::::::::::::::::::::::
//::::::串口发送一个字符
//::::::::::::::::::::::::::::::::::::::::::
void COM_sendoneChar(unsigned char CH)
{
SBUF = CH;
while(!TI);
TI = 0;
}
//::::::::::::::::::::::::::::::::::::::::::
//::::::串口发送一个字符串
//::::::::::::::::::::::::::::::::::::::::::
void COM_sendstring(unsigned char *String)
{
while(*String != '\0')
{
COM_sendoneChar(*String);
String++;
}
}
//::::::::::::::::::::::::::::::::::::::::::
void main(void)
{
init_serialcomm();
COM_sendstring(">Version information:1.0.0 ");
COM_sendstring("\r\n");
COM_sendstring(">Program function :Eight LED control Demo");
COM_sendstring("\r\n");
COM_sendstring("-------------------------------------");
COM_sendstring("\r\n");
while(1)
{
if(outFlag == 1)
{
if (a == 1)
{
switch(a)
{
case 1:if(a==0)D0=ON;else D0=OFF;break;
case 2:if(a==0)D1=ON;else D1=OFF;break;
case 3:if(a==0)D2=ON;else D2=OFF;break;
case 4:if(a==0)D3=ON;else D3=OFF;break;
case 5:if(a==0)D4=ON;else D4=OFF;break;
case 6:if(a==0)D5=ON;else D5=OFF;break;
case 7:if(a==0)D6=ON;else D6=OFF;break;
case 8:if(a==0)D7=ON;else D7=OFF;break;
default:break;
}
COM_sendstring(" ");
COM_sendstring("Number->");
COM_sendoneChar(a + 0x30); //输出通道显示
COM_sendstring(" = ");
COM_sendstring(a <= 0 ? "Open":"Close"); //输出状态
COM_sendstring("\r\n"); //换行
}
if (a == 8)
{
P0 = a <= 0 ? 0x00:0xff;
COM_sendstring(" ");
COM_sendstring(a <= 0 ? "All port = Open! ^_~ or ~_^ " : "All port = Close! ^_~ or ~_^");
COM_sendstring("\r\n");
}
outFlag=0;
}
}
}
//::::::::::::::::::::::::::::::::::::::::::
//::::::::::::::::::::::::::::::::::::::::::
void serial_serve(void) interrupt 4
{
//起始地址:A(设备ss号) + 控制字 + 端口号 + 端口状态 + !(郑伟)
unsigned char temp = 0x00;
RI = 0;
EA = 0;
temp = SBUF;
switch(Count)
{
case 0:
if ((temp == Address) || (temp == 0xff))
Count = 1;
else Count = 0;
break;
case 1:
if ((temp == 0x31) || (temp == 0x38))
{ a = temp - 0x30;
switch (a)
{
case 1: Count = 2; break;
case 8: Count = 3;break;
default:
break;
}
}
elseCount = 0;
break;
case 2:
if ((temp > 0x30) && (temp < 0x39))
{ a = temp - 0x30;
Count = 3;
}
elseCount = 0;
break;
case 3:
if ((temp == 0x30) || (temp == 0x31))
{ a = temp - 0x30;
Count = 4;
}
elseCount = 0;
break;
case 4:
if (temp == '!')
{ Count = 0;
outFlag = 1;
}
elseCount = 0;
break;
default:
break;
}
EA=1;
}
这个程序的字体真好看,各位是不是?
HeP028 发表于 2012-9-22 15:28 static/image/common/back.gif
我要发数据包呢, struct packet{
int DataBuf; // 起始符(包头起始标志0Xbb)包头:1-2字节
char len; // 数据](包长度) 1-2字节
char content; //数据 内容
int check; //奇偶
int tail;//结束符(包尾结束标志0XAA)包头:1-2字节
}
我怎样在char content; 装不同的值呢,
还是用什么方法,能知道,数据结构的总长度呢,
还有int check; //奇偶 怎样设呀,
页:
[1]