项目设计之初千万不要把虚拟串口当作一个可靠地外设接口。
可以用IO模拟串口发送数据。
不要用模拟串口接收数据。
只有在设计之初没有考虑到,没办法临时救急可以用一下模拟的串口。
发送直接写IO电平然后delay就可以。
接收必须要IO中断加定时器,不要IO中断里面delay,项目大了会出现程序跑飞。
/*10us*/
uint8_t uart_tp=0;
void TIM1_BRK_UP_TRG_COM_IRQHandler()
{
static u16 n=0,i=0;
static uint8_t Res=0;
if(TIM_GetITStatus(TIM1, TIM_IT_Update) != RESET) //检查TIM1更新中断发生与否
{
if(uart_tp==1)
{
n++;
if((n== 41+6 +42*i) && i<8)
{
Res |= RX_25<<i;
i++;
}
if( n== 41+6 + 42*8 -5 )//停止位
{
i = 0;
n = 0;
if(!PM25_BUFFER_data_tp)//0
{
infifo(Res);
}
Res = 0;
uart_tp = 0;
EXTI->IMR |= EXTI_Line_s_urt;//开中断线1
}
}
TIM_ClearITPendingBit(TIM1, TIM_IT_Update );
}
}
//2400 波特率 终端里面用了delay很不好,等有多余的定时器在修改
void EXTI0_1_IRQHandler(void)
{
if(EXTI_GetITStatus(EXTI_Line_s_urt) != RESET)
{
EXTI->IMR &= ~EXTI_Line_s_urt;//屏蔽中断1
uart_tp=1;
EXTI_ClearITPendingBit(EXTI_Line_s_urt);
}
}
//2400 b/s
void Simurt_SendOneByte(uint8_t Byte)
{
uint8_t i=8,tmp;
TX_0;
delay_us(416);
for(i=0;i<8;i++)
{
tmp = (Byte >> i) & 0x01;
if(tmp == 0)
{
TX_0;
delay_us(416); //0
}
else
{
TX_1;
delay_us(416); //1
}
}
TX_1;
delay_us(416);
}
总结:不要用模拟串口做项目。那个只能做下实验玩玩。
|