新手上路
- 积分
- 44
- 金钱
- 44
- 注册时间
- 2013-4-22
- 在线时间
- 0 小时
|
硬件是mini开发板,串口一收上位机发送的数据后通过串口一发送给上位机。在串口实验基础上修改的,约定数据开头必须以aa开头,以0d和0a结尾。发送数据如下:aa 01 02 ae 00 00 26 51 db 0d 0a (这里的0d和0a是数据结尾不是回车),收到的数据却是3F 02 00,这是什么呀?晕死了,监控收到的数据全部正常。用mini开发板自带的串口调试工具发送数据没有反应,调试时用的是 全能通讯调试器 xp终结版 程序序如下:
主函数:
int main(void)
{
stm32_clock_init(9);
delay_init(72);
uart_init(72,9600);
while(1)
{
if(send_flag==1)
{
send_flag=0;
show_data_send(9);
}
}
}
串口接收函数:
u8 usart1_rx_flag=0;
u8 rx_data_num=0;
u8 usart_rx_buf[64];
void USART1_IRQHandler(void)
{
u8 temp;
if(USART1->SR&(1<<5)) //接收到数据
{
temp=USART1->DR;
if((usart1_rx_flag&0x80)==0) //接收未完成
{
if(usart1_rx_flag&0x20) //接收到aa
{
if(usart1_rx_flag&0x40) //接收到0d
{
if(temp!=0x0a)usart1_rx_flag=0; //重新接收
else
{
usart1_rx_flag|=0x80; //接收完成
rx_data_num=0;
send_flag=1;
}
}
else
{
if(temp==0x0d)usart1_rx_flag|=0x40;
else
{
usart_rx_buf[rx_data_num]=temp;
rx_data_num++;
if(rx_data_num>63) rx_data_num=0; //重新接收
}
}
}
else
{
if(temp==0xaa)
{
usart1_rx_flag|=0x20;
usart1_rx_buf[rx_data_num]=temp;
rx_data_num++;
}
else usart1_rx_flag=0; //重新接收
}
}
}
}
发送函数:
void show_data_send(u16 pack_num)
{
u16 tx_num;
for(tx_num=0;tx_num<pack_num;tx_num++)
{
usart1->=usart_rx_buf[tx_num];
while((usart1->SR&0x40)==0);
}
}
|
|