在用stc8a跟设备通信,通信格式如下
1、通信规则
通信方式:异步串行通讯
波特率:600BPS
数据位:8BIT
奇偶校验:偶校验
结束位:2BIT(高电平)
起始位:1BIT(低电平)
2.通信数据结构
通信数据由以下18 字节构成:
第0 字节......通信开始识别码aah(固定为10101010B)
第1 字节......源地址
第2 字节......目标地址
第3 字节......命令
第4 字节......参数内容1
第5 字节......参数内容2
......
第16 字节......校验和
第17 字节......通信结束识别码055h(固定为01010101B)
监测设备本身串口通信数据为
AA 01 00 00 05 01 00 00 00 00 17 01 8D AF 0A 00 9B 55
直接用电脑串口发送数据设备没反应,用STC8A发送也没反应,程序如下,有没大虾帮忙看看?本人半路出家现学现用太深奥的还不懂
#include "STC8.H"
#include "intrins.h"
#define MAIN_Fosc 11059200L //定义主时钟
#define uint32 unsigned long
#define uint16 unsigned int
#define uint8 unsigned char
/************* 本地变量声明 **************/
uint8 xdata Rec_Buf[Buf_Max];
uint8 i = 0;
uint8 uart1temp;
uint8 k;
uint8 code uart_17[16]={0xAA,0x01,0x00,0x00,0x05,0x01,0x00,0x00,0x00,0x00,0x17,0x01,0x8D,0xAF,0x0A,0x00};
uint8 jyh;
/**************************************
功能描述:延时函数
入口参数:uint16 x ,该值为1时,延时1ms
返回值:无
***************************************/
void delay_ms(uint16 x)
{
uint16 j,i;
for(j=0;j<x;j++)
{
for(i=0;i<1100;i++);
}
}
/***************************************************************************
* 描 述 : 串口1初始化函数
* 入 参 : 无
* 返回值 : 无
备注:波特率600bps 晶振11.0592MHz
**************************************************************************/
void Uart1_Init(void)
{
PCON &= 0x3f; //波特率不倍速,串行口工作方式由SM0、SM1决定
SCON = 0xd0; //9位数据,可变波特率,启动串行接收器
AUXR |= 0x40; //定时器1时钟为Fosc,即1T
AUXR &= 0xfe; //串口1选择定时器1为波特率发生器
TMOD &= 0x0f; //清除定时器1模式位
TL1 = 0x00; //设定定时初值
TH1 = 0xee; //设定定时器重装值
ET1 = 0; //禁止定时器1中断
TR1 = 1; //启动定时器1
ES = 1; // 串口1中断打开
EA = 1; // 总中断打开
}
/***************************************************************************
* 描 述 : 串口1发送数据函数
* 入 参 : uint8 数据
* 返回值 : 无
**************************************************************************/
void SendDataByUart1(uint8 dat)
{
ACC=dat; //增加偶校验,是否正确?
TB8=P; // 增加偶校验,是否正确?
SBUF = dat; //写数据到UART数据寄存器
_nop_(); //模拟2位停止位?
while(TI == 0); //在停止位没有发送时,TI为0即一直等待
TI = 0; //清除TI位(该位必须软件清零)
_nop_(); //模拟2位停止位?
}
void USART1_Tx_Puts2(k)
{
ES = 0; //串口1中断关闭
SendDataByUart1(k); //发送字符
ES = 1; //串口1中断打开
}
/***********************
功能描述:主函数
入口参数:无
返回值:无
************************/
int main()
{
P3M1 &= 0xFE; P3M0 &= 0xFE; //设置P3.0为准双向口
P3M1 &= 0xFD; P3M0 |= 0x02; //设置P3.1为推挽输出
Uart1_Init();
while(1)
{
uint8 i;
for(i=0;i<16;i++)
{
USART1_Tx_Puts2(uart_17[i]);
}
for(i=1;i<16;i++)
{
jyh+=uart_17[i]; //计算校验和
}
jyh=(jyh^0xff)+1; //计算校验和
USART1_Tx_Puts2(jyh); //发送校验和
jyh=0; //校验和清0
USART1_Tx_Puts2(0x55); //发送结束码
}
delay_ms(500000);
}
|