新手入门
- 积分
- 17
- 金钱
- 17
- 注册时间
- 2016-10-21
- 在线时间
- 3 小时
|
基于 STM32F103VE 在uc/os iii 移植FreeModbus能正常接收,但不能正常发送。都是在中断中进行的。
1, 测试没有带ucos iii ,没有带 FreeModbus的,利用中断能正常接收,也能正常发送。说明硬件没有问题。
2,在uc/os iii 且移植FreeModbus 能正常接收,能进入中断,就是在中断里的 USART_SendData(USART1, date)没有数据发出,示波器测试确定真的没有数据发出。
把在中断处理发送的代码利用信号量转换成任务级来发送也是一样的没有数据发出(不用这个方法直接在串口中断里面发送数据处理也是一样的不能正常发送),在USART_SendData(USART1, date); 加入while (USART_GetFlagStatus(USART1,USART_FLAG_TC) !=SET);也是一样的没有数据发出。如下是直接在中断里面处理的:
请各位大师指点,请原子哥出山指点。
中断程序如下:
//此做从机,被动的接收,再发送数据。
void USART1_IRQHandler(void)
{
OS_ERR err;
OSIntEnter();
if(USART_GetITStatus(USART1, USART_IT_RXNE) == SET)
{
USART_ClearITPendingBit(USART1, USART_IT_RXNE);
// 发布任务信号量
OSTaskSemPost((OS_TCB *)&AppTaskUsart1RXTCB,//AppTaskUsart1RXTCB, //目标任务
(OS_OPT )OS_OPT_POST_NONE, //没选项要求
(OS_ERR *)&err); //返回错误类型
//prvvUARTRxISR(); //Modbus Uart1 ISR
}
if(USART_GetITStatus(USART1, USART_IT_TXE) == SET)
{
/* // 发布任务信号量
// OSTaskSemPost((OS_TCB *)&AppTaskUsart1TXTCB, //目标任务
// (OS_OPT )OS_OPT_POST_NONE, //没选项要求
// (OS_ERR *)&err);
*/
prvvUARTTxReadyISR(); //Modbus Uart1 ISR
// USART_ClearITPendingBit(USART1, USART_IT_TC);//USART_IT_TC
}
OSIntExit();
}
prvvUARTTxReadyISR()函数与 发送有关的部分如下:
case STATE_TX_XMIT:
/* check if we are finished. */
if( usSndBufferCount != 0 )
{
USART_ClearITPendingBit(USART1, USART_IT_TC);
xMBPortSerialPutByte( ( CHAR )*pucSndBufferCur ); //此函数 即 :USART_SendData(USART1, ucByte);这个函数。
while (USART_GetFlagStatus(USART1, USART_FLAG_TXE)== RESET); //USART_FLAG_TC!=SET); //
USART_ClearITPendingBit(USART1, USART_IT_TC);
pucSndBufferCur++; /* next byte in sendbuffer. */
usSndBufferCount--;
}
else
{
xNeedPoll = xMBPortEventPost( EV_FRAME_SENT );
vMBPortSerialEnable( TRUE, FALSE );
eSndState = STATE_TX_IDLE;
}
break;
操作系统正常运行,我用uc/probe 测过的,就是USART_SendData(USART1, ucByte)没有数据发出,我用示波器也测过。
|
|