高中生
最后登录1970-1-1
在线时间 小时
注册时间2015-11-5
|
本帖最后由 cjdxyhz@126.com 于 2016-10-21 16:40 编辑
基于 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)
{
USART_ClearITPendingBit(USART1, USART_IT_TXE);//USART_IT_TC
// 发布任务信号量
OSTaskSemPost((OS_TCB *)&AppTaskUsart1TXTCB, //目标任务
(OS_OPT )OS_OPT_POST_NONE, //没选项要求
(OS_ERR *)&err);
// prvvUARTTxReadyISR(); //Modbus Uart1 ISR
}
OSIntExit();
}
任务处理如下:
// USART1 发送中断发出信号量。
static void AppTaskUsart1TX ( void * p_arg )
{
OS_ERR err;
CPU_TS ts;
(void)p_arg;
while (DEF_TRUE)
{ //接收一个中断发送到任务信号量。
//阻塞任务,直到中断发出信号量,发部任务信号量
OSTaskSemPend ((OS_TICK )0, //无期限等待
(OS_OPT )OS_OPT_PEND_BLOCKING, //如果信号量不可用就等待
(CPU_TS *)&ts, //获取信号量被发布的时间戳
(OS_ERR *)&err); //返回错误类型
prvvUARTTxReadyISR(); //Modbus Uart1 ISR
}
}
prvvUARTTxReadyISR()函数与 发送有关的部分如下:
case STATE_TX_XMIT:
/* check if we are finished. */
if( usSndBufferCount != 0 )
{
xMBPortSerialPutByte( ( CHAR )*pucSndBufferCur ); //此函数 即 :USART_SendData(USART1, ucByte);这个函数。
while (USART_GetFlagStatus(USART1,USART_FLAG_TC) !=SET);
pucSndBufferCur++; /* next byte in sendbuffer. */
usSndBufferCount--;
}
else
{
xNeedPoll = xMBPortEventPost( EV_FRAME_SENT );
/* Disable transmitter. This prevents another transmit buffer
* empty interrupt. */
vMBPortSerialEnable( TRUE, FALSE );
eSndState = STATE_TX_IDLE;
}
break;
操作系统正常运行,我用uc/probe 测过的,就是USART_SendData(USART1, ucByte)没有数据发出,我用示波器也测过。
|
|