老师好,问下关于串口数据发送问题,为何程序里数据发送不正确?
数据发送应该为55 02 20 03 61 62 63 00 00 55可是数据里,20 03总是发送不对
请老师帮忙看下,谢谢
程序如下:
#include <iom16v.h>
#include <macros.h>
#define uchar unsigned char
#define uintunsigned 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;
}txd;
volatile struct
{
uchar pt;
uchar ptx;
uchar buf;
}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=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;
uchar i;
uchar tmp;
dataTmp = (uchar *)malloc(7 + sendFrame.dataLen);
dataTmp = 0x55;
dataTmp = sendFrame.frameLen;
dataTmp = sendFrame.function;
dataTmp = sendFrame.dataLen;
memcpy(dataTmp + 4, sendFrame.Data, sendFrame.dataLen);
dataTmp = (uchar)(sendFrame.crc >> 8); //low byte first;
dataTmp = (uchar)(sendFrame.crc);
dataTmp = 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 03 不对,问题在你的程序中。
页:
[1]