[mw_shl_code=c,true]//发送读数据指令
//返回0表示发送完毕
int cmd_read()
{
unsigned char readCmd[8]={0x01, 0x03, 0x90, 0x01, 0, 0x09, 0xF9, 0x0C};
int i=0;
TX_Mode();//发送模式
for(i=0;i<8;i++)
{
USART_SendData(USART3, readCmd);//发送数据
while(USART_GetFlagStatus(USART3,USART_FLAG_TXE) == RESET);
}
delay_us(500);//不延时第一次按都进不了中断,不知道为什么
RX_Mode();//接收模式
return 0;
}
[/mw_shl_code]
[mw_shl_code=c,true]int main(void)
{
u8 i = 0,k;
u8 res=1;
SystemInit();//系统初始化,主频设置为72MHz
delay_init(72);//滴答时钟初始化设置
USART1_Config();//串口输出初始化
RS485_Config(); //485初始化
NVIC_485_Configuration();//485中断初始化
GPIO_KEY_Config();//按键初始化
printf("\r\n RS485测试 \r\n");
USART_Cmd(USART3, ENABLE);
USART_ITConfig(USART3, USART_IT_RXNE, ENABLE);//使能接收中断
[/mw_shl_code]
RX_Mode();
[mw_shl_code=c,true] while(1)
{
if(ReadKey()== KEY1)
{
printf("开始发送指令\n");
res=cmd_read();
while(res);//等待指令发送完毕
printf("指令发送完毕\n");
while(RxCounter < RxBufferSize)//等待接收完成
{
;
}
printf("\n\r接收到的数据:");
for(k=0;k<RxCounter;k++)
printf("%x ",RxBuffer[k]);//打印接收数据
printf("\n");
res=1;
RxCounter = 0;//清空接收计数
}
}
}[/mw_shl_code]
void USART3_IRQHandler(void) //rs485中断
{
if(USART_GetITStatus(USART3, USART_IT_RXNE) != RESET)//接收到数据
{
USART_ClearITPendingBit(USART3, USART_IT_RXNE);//清除接收中断标志位
RxBuffer[RxCounter++] = USART_ReceiveData(USART3);//读取接收数据
}
}