|
数据发送应该为55 02 20 03 61 62 63 00 00 55
可是数据里,20 03总是发送不对
请老师帮忙看下,谢谢
程序如下:
#include <iom16v.h>
#include <macros.h>
#define uchar unsigned char
#define uint unsigned int
#define fosc 8000000 //晶振8MHZ
#define baud 9600 //波特率
#define UARTRL (fosc/16/(baud+1))%256;
#define UARTRH (fosc/16/(baud+1))/256;
////////////////////
// 公用变量区
////////////////////
volatile uchar i,j,k;
volatile struct
{
uchar out_time; //发送超时
uchar pt;
uchar ptx;
uchar buf[12];
}txd;
volatile struct
{
uchar pt;
uchar ptx;
uchar buf[12];
}rxd;
typedef struct{
uchar head;
uchar frameLen;
uchar function;
uchar dataLen;
uchar *Data;
uchar crc;
uchar end;
}COMMUNICATION_STRUCT;
unsigned char rx_ok;
unsigned char tx_ok;
volatile COMMUNICATION_STRUCT Commu_Protocol;
////////////////////
// 子函数区
////////////////////
void port_init(void)
{
PORTA = 0x00;
DDRA = 0x00;
PORTB = 0x00;
DDRB = 0x02;
PORTC = 0x00;
DDRC = 0x01;
PORTD = 0x00;
DDRD = 0x00;
}
void uart0_init(void)
{
UCSRB = 0x00; //disable while setting baud rate
UCSRA = 0x00;
UCSRC = (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);//8位数据+1位STOP位
UBRRL = 0x33; //set baud rate lo
UBRRH = 0x00; //set baud rate hi
UCSRB = 0xD8;
rxd.pt= 0;
rx_ok = 0;
}
#pragma interrupt_handler uart0_rx_isr:12
void uart0_rx_isr(void)
{ uchar i,j;
i=UDR;
rxd.buf[rxd.pt]=i;
rxd.pt++;
if(rxd.pt>=8) //接收8个数据
{
rx_ok=0x55;
PORTB=~PORTB;
}
}
#pragma interrupt_handler uart0_tx_isr:14
void uart0_tx_isr(void)
{
}
void init_devices(void)
{
CLI();
port_init();
uart0_init();
SEI();
}
//发送采用查询方式
void put_one(uchar c)
{
UDR=c;
while(!(UCSRA & (1<<UDRE)));
}
//发送字符串
void put_s(uchar *ptr)
{
while (*ptr)
{
put_one(*ptr++);
}
}
void USART_Transmit(uchar *data, uchar len)
{
while(len --) {
while(!(UCSRA & (1 << UDRE)));
UDR = *(data++);
}
}
void USART_Frame_Transmit(COMMUNICATION_STRUCT sendFrame)
{
uchar *dataTmp;
//uchar dataTmp[7];
uchar i;
uchar tmp;
dataTmp = (uchar *)malloc(7 + sendFrame.dataLen);
dataTmp[0] = 0x55;
dataTmp[1] = sendFrame.frameLen;
dataTmp[2] = sendFrame.function;
dataTmp[3] = sendFrame.dataLen;
memcpy(dataTmp + 4, sendFrame.Data, sendFrame.dataLen);
dataTmp[5 + sendFrame.dataLen] = (uchar)(sendFrame.crc >> 8); //low byte first;
dataTmp[4 + sendFrame.dataLen] = (uchar)(sendFrame.crc);
dataTmp[6 + sendFrame.dataLen] = 0x55;
tmp = 0x55;
USART_Transmit(&tmp, 1);
for(i = 1; i <(6+sendFrame.dataLen); i++) {
if(dataTmp == 0x55) {
tmp = 0x56;
USART_Transmit(&tmp, 1);
tmp = 0x56;
USART_Transmit(&tmp, 1);
}
else if(dataTmp == 0x56) {
tmp = 0x56;
USART_Transmit(&tmp, 1);
tmp = 0x57;
USART_Transmit(&tmp, 1);
}
else
USART_Transmit(dataTmp + i, 1);
}
tmp = 0x55;
USART_Transmit(&tmp, 1);
free(dataTmp);
}
/****************/
/*主函数--MAIN */
/****************/
void main(void)
{
init_devices(); //初始化MAGE16;
Commu_Protocol.frameLen = 2;
Commu_Protocol.function = 0x20;
Commu_Protocol.dataLen = 3;
Commu_Protocol.Data="123";
Commu_Protocol.crc = 0;
USART_Frame_Transmit(Commu_Protocol); |
阿莫论坛20周年了!感谢大家的支持与爱护!!
一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。
|