新手上路
- 积分
- 22
- 金钱
- 22
- 注册时间
- 2011-5-22
- 在线时间
- 0 小时
|
发表于 2011-5-22 00:24:18
|
显示全部楼层
正点原子的串口程序太恶心了,非要换行回车发送才能接收。我改了一下,在主循环处理串口接收,用定时器判断超时.
void UART1_SendByte(u8 dat)
{
USART1->DR = (u8) dat;
while((USART1->SR&0X40)==0);//循环发送,直到发送完毕
}
void UART1_SendStr(char *str)
{
while (1)
{
if (*str == '\0')
{
break; // 遇到结束符,退出
}
UART1_SendByte(*str++);
}
}
void UART1SendBytes(u8 *buffer, u16 size)
{
while(size--) {
USART1->DR =*buffer++;
while ((USART1->SR&0X40)==0);
}
}
void USART1_IRQHandler(void)
{
if(USART1->SR&(1<<5))//接收到数据
{
if(iCom1RecvCount==0) UART1_Rx_Flag =1;
cCom1RecvBuf[iCom1RecvCount] = USART1->DR;
iCom1RecvCount++;
iCom1RecvCount %= MAX_UART_RECV_BUFF;
}
}
void  roSerialProtocol(char *pStrcmd, unsigned short iRecvcnt)
{
if(iRecvcnt > 255) {
sprintf(strp, "%s", pStrcmd);
UART1_SendStr(strp);
}
else{
if( !strcmp( pStrcmd, "$scan" ) || !strcmp( pStrcmd, "$scan\r\n" ) ) {
sprintf(strp,"scan mod\r\n");
UART1_SendStr(strp);
}
else if( !strcmp( pStrcmd, "$ver" ) || !strcmp( pStrcmd, "$ver\r\n" ) ) {
UART1_SendStr((char *)cVersion);
}
else if( !strcmp( pStrcmd, "$bye" ) || !strcmp( pStrcmd, "$bye\r\n" ) ) {
UART1_SendStr("bye\r\n");
}
}
}
void  roSerial1(void)
{
if(bCom1RecvOver) {
delay_ms(20);
if(iCom1RecvCount > 0) {
cCom1RecvBuf[iCom1RecvCount] = 0;
ProSerialProtocol((char *)cCom1RecvBuf, iCom1RecvCount);
bCom1RecvOver = 0;
iCom1RecvCount = 0;
}
}
}
void TIM3_IRQHandler(void)
{
if(TIM3->SR&0X0001){//溢出中断
tcount++;
if(tcount>=50) {
tcount = 0;
SYS_LED=!SYS_LED;
}
if(UART1_Rx_Flag){
UART1_COUNT++;
if(UART1_COUNT>=2) {
bCom1RecvOver = 1;
UART1_Rx_Flag = 0;
UART1_COUNT = 0;
}
}
}
TIM3->SR&=~(1<<0);//清除中断标志位
}
void SYS_Init(void)
{
Stm32_Clock_Init(9); //系统时钟设置
delay_init(72); //延时初始化
uart_init(72,57600); //串口初始化为57600
LED_Init(); //初始化与LED连接的硬件接口
SYS_LED = 1;
tcount = 0;
iCom1RecvCount = 0;
bCom1RecvOver = 0;
UART1_Rx_Flag = 0;
UART1_COUNT = 0;
//Timerx_Init(5000,7199); //10Khz的计数频率,计数到5000为500ms
Timerx_Init(100,7199); //10Khz的计数频率,计数到100为10ms
// SYS_LED = 0;
}
int main(void)
{
SYS_Init();
UARTSendDebugInfo();
while(1)
{
ProSerial1();
}
} |
|