初级会员

- 积分
- 195
- 金钱
- 195
- 注册时间
- 2012-6-14
- 在线时间
- 0 小时
|

楼主 |
发表于 2014-5-7 15:06:16
|
显示全部楼层
我看到了原来阿莫论坛中有个关于STM32串口通信将的比较全面的文章我下载下来给大家伙看看,自己正在消化!有的大神不要拍砖呵呵!
主要讲的STM32串口驱动(拼音检索测试通过)(环形队列+内存动态分配+DMA)
我消化过程中有这个几个问,那位大神看到后帮我看看!
USART.C文件中串口发送函数:
void USART1SendUpdate(void)
{
static unsigned char count=0;
if(USART1SendQFree==USART1_SEND_MAX_BOX){return;}
USART1StopSendISR();
//如果现在的内存块的数据还没有发送完毕,启动发送,Num减一
if((USART1SendTCB[USART1SendQBoxTail].Num)&&(USART1SendQBoxTail!=USART1SendQBoxHost))
{
USART1SendTCB[USART1SendQBoxTail].Num--;
USART1SendByte(*(USART1SendTCB[USART1SendQBoxTail].Index+count));
count++;
}
//一个发送块已经发送完毕了 ,USART1SendQFree++,尾指针加一。指向下一个发送块
else if(USART1SendQBoxTail!=USART1SendQBoxHost) //疑问:这个不与上面的IF条件函数产生冲突??
{
OSMemDelete(OSQUSART1Index,USART1SendTCB[USART1SendQBoxTail].Index);
if(++USART1SendQBoxTail>=USART1_SEND_MAX_BOX)
USART1SendQBoxTail=0;
if(++USART1SendQFree>=USART1_SEND_MAX_BOX)
USART1SendQFree=USART1_SEND_MAX_BOX;
count=0;
//USART1SendQBoxTail等于USART1SendQBoxHOST的时候就标志这发送结束了,可以直接退出
if((USART1SendQBoxTail!=USART1SendQBoxHost)) //与上面红色字体一样的疑问?
{
USART1SendTCB[USART1SendQBoxTail].Num--;
USART1SendByte(*(USART1SendTCB[USART1SendQBoxTail].Index+count));
count++;
}
else
{
//USART1SendQBoxTail等于USART1SendQBoxTail的时候就标志这发送结束了,可以直接退出
USART1RunningFlag=0;
USART1SendQFree=USART1_SEND_MAX_BOX;
count=0;
}
}
//由于头指针一直是指向空的发送块的,所以USART1SendQBoxTail等于USART1SendQBoxHost
//的时候就标志这发送结束了,可以直接退出
····else
····{
·······USART1RunningFlag=0;
·······USART1SendQFree=USART1_SEND_MAX_BOX;
·······count=0;
····}
····USART1StartSendISR();
}
//懂的师兄师姐们能否帮我解答这个疑问?? |
|