OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3735|回复: 1

单线半双工串口通信,大神们来指导一下,有图,有代码

[复制链接]

5

主题

27

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
214
金钱
214
注册时间
2017-6-26
在线时间
49 小时
发表于 2017-8-1 15:00:04 | 显示全部楼层 |阅读模式
5金钱
怎样才能完成 收或发 呢?

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *UartHandle)
{
        static signed portBASE_TYPE xHigherPriorityTaskWoken;
       
        if(UartHandle->Instance == USART1)
        {
                xQueueSendFromISR(UART1_RX_QueueHandle,&UART1_RX_DATA,0);
                HAL_UART_Receive_IT(&huart1,&UART1_RX_DATA,1);
        }
        portYIELD_FROM_ISR( xHigherPriorityTaskWoken );
}
//串口1发送中断回掉函数
void HAL_UART_TxCpltCallback(UART_HandleTypeDef *UartHandle)
{
        static signed portBASE_TYPE xHigherPriorityTaskWoken;

        if(UartHandle->Instance == USART1)
        {
                xSemaphoreGiveFromISR(UART1_TX_semHandle_Mutex, &xHigherPriorityTaskWoken);
               
        }
        portYIELD_FROM_ISR( xHigherPriorityTaskWoken );
}
void Send_TX_Queue(void)
{
        uint8_t i;
        if(xSemaphoreTake(UART1_TX_semHandle_Mutex,portMAX_DELAY))
        {
                for(i = 1;i<=3; i++)
                        xQueueSend(UART1_TX_QueueHandle,&i,0);

                xSemaphoreGive(UART1_TX_semHandle_Mutex);
        }
}                       
#endif

void COM_task(void *argument)
{
        TickType_t xLastWakeTime;
       
        uint16_t counter;                     
       
//        uint8_t UART1_RX_DATA_TEMP = 0;
//        uint8_t UART1_TX_DATA_TEMP = 0;
       
        uint8_t TX_buf[1000];
       
        const TickType_t xFrequency = 500;  //  ms
        xLastWakeTime = xTaskGetTickCount();
       
        xSemaphoreGive(UART1_TX_semHandle_Mutex);  //信号量使用前先释放
       

        IO_OUT();                                                //将PA9配置为输出       
        for(;;)
        {
        /* ----------------------------串口发送处理-----------------------------*/
//                if(xSemaphoreTake(UART1_TX_semHandle_Mutex,0))        //获取到发送信号量
//                {
//       
//                }
                vTaskDelayUntil( &xLastWakeTime, xFrequency );
                Send_TX_Queue();
               
                counter = 0;
                while(xQueueReceive(UART1_TX_QueueHandle,TX_buf +counter,0))
                {
                        counter++;
                        if(counter >= 1000)
                                break;
                       
                }
                HAL_UART_Transmit_IT(&huart1,TX_buf,counter);


正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

5

主题

32

帖子

0

精华

初级会员

Rank: 2

积分
149
金钱
149
注册时间
2016-10-28
在线时间
41 小时
发表于 2017-8-21 19:13:17 | 显示全部楼层
怎么搞单线半双工,我现在能发不能收啊!!!!!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-21 01:21

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表