一个串口同时传输多个数据

程序目标:实验中在调试程序时,需要在只用到一个串口的条件下,用上位机同时向单片机传送多个不同数据。
实现原理:1,用LabView编写的上位机,使用VISA向单片机中写入数据;多个数据之间用一些分隔符进行区分。
2,定义一个字符串USART_RX_BUF[]接收收据,然后在该字符串中查找相应的分隔符并得到它们在字符串中的位 置,最后根据这些位置从字符串中提取出相应的字符串,这样就可以得到在上位机中输出的几种不同的数据。
LabView程序前面板
这里写图片描述

void USART1_IRQHandler(void) //串口1中断服务程序
    {
    u8 Res;
#if SYSTEM_SUPPORT_OS//如果SYSTEM_SUPPORT_OS为真,则需要支持OS.
    OSIntEnter();    
#endif
    if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) //接收中断(接收到的数据必须是0x0d 0x0a结尾)
        {
        Res =USART_ReceiveData(USART1); //读取接收到的数据

        if((USART_RX_STA&0x8000)==0)//接收未完成
            {
            if(USART_RX_STA&0x4000)//接收到了0x0d
            {
                if(Res!=0x0a)USART_RX_STA=0;//接收错误,重新开始
                else 
                {
                    USART_RX_STA|=0x8000;//接收完成了 
                    LEN=USART_RX_STA&0x3FFF;
                }
            }
            else //还没收到0X0D
                {   
                if(Res==0x0d)USART_RX_STA|=0x4000;
                else
                    {
                    USART_RX_BUF[USART_RX_STA&0X3FFF]=Res ;
                    USART_RX_STA++;
                    if(USART_RX_STA>(USART_REC_LEN-1))USART_RX_STA=0;//接收数据错误,重新开始接收      
                    }        
                }
            }            
     } 
#if SYSTEM_SUPPORT_OS //如果SYSTEM_SUPPORT_OS为真,则需要支持OS.
    OSIntExit();                                             
#endif
} 
#endif  
int main(void)
{
    char *P,*I,*D;
    char FQ[12],KP[8],KI[8],KD[8];  
    u8 x,y,z;
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置中断优先级分组为组2:2位抢占优先级,2位响应优先级
    uart_init(115200);//串口初始化为115200
    LCD_Init(); //初始化LCD    

    POINT_COLOR=BLUE;//设置字体为蓝色

    memset(FQ,'\0',sizeof(FQ)); //将字符数组设为空字符数组
    memset(KP,'\0',sizeof(KP));
    memset(KI,'\0',sizeof(KI));
    memset(KD,'\0',sizeof(KD));


    while(1)
    {
        if(USART_RX_STA&0x8000) //串口接收状态标志位就绪
        {
            LCD_Fill(30,250,230,250+16,WHITE); //清空指定区域
            LCD_Fill(30,270,230,270+16,WHITE);
            LCD_Fill(30,290,230,290+16,WHITE);
            LCD_Fill(30,310,230,310+16,WHITE);

            P=strrchr((char*)USART_RX_BUF,'p'); //查找字符串中字符'p'的位置,并返回最后一次指向该字符串的指针
            I=strrchr((char*)USART_RX_BUF,'i');         
            D=strrchr((char*)USART_RX_BUF,'d'); 

            x=(u8*)P-USART_RX_BUF;//得到字符'p'在字符串中的偏移量,从而得到第一段字符串的长度
            y=(u8*)I-(u8*)(++P);  //得到字符'i'在以P为首地址的字符串中的长度,从而得到第二段字符串的长度
            z=(u8*)D-(u8*)(++I);  

            memcpy(FQ,USART_RX_BUF,x); //从接受到的字符串中复制第一段字符串
            memcpy(KP,P,y);//从接受到的字符串中复制第二段字符串
            memcpy(KI,I,z);//从接受到的字符串中复制第三段字符串

            LCD_ShowString(30,250,200,16,16,(char*)FQ); //在LCD上显示第一段字符串
            LCD_ShowString(30,270,200,16,16,(char*)KP);
            LCD_ShowString(30,290,200,16,16,(char*)KI);
            LCD_ShowString(30,310,200,16,16,(++D));//在LCD上显示第四段字符串

            USART_RX_STA=0; //清空状态标志位
            for(i=0;i<USART_REC_LEN;i++)
                USART_RX_BUF[i]=' '; //将接受的字符串清空
            memset(FQ,'\0',sizeof(FQ)); //将字符数组设为空字符数组
            memset(KP,'\0',sizeof(KP));
            memset(KI,'\0',sizeof(KI));
            memset(KD,'\0',sizeof(KD));
        }
        delay_ms(10);
    }
}

程序运行结果:LabView中输入的四种数据,在单片机中都分别实时显示在LCD屏幕上

注意点:LabView中输入的字符串的长度最好不要大于定义的字符数组

  • 6
    点赞
  • 45
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
STM32F103C8T6芯片有多个UART串口,可以同时传输数据。您可以使用STM32 HAL库提供的UART驱动程序来实现多个串口传输。 首先,您需要初始化两个UART串口,可以使用HAL_UART_Init函数。例如,如果您要初始化USART1和USART2,请使用以下代码: ``` /* 初始化USART1 */ UART_HandleTypeDef huart1; huart1.Instance = USART1; huart1.Init.BaudRate = 9600; huart1.Init.WordLength = UART_WORDLENGTH_8B; huart1.Init.StopBits = UART_STOPBITS_1; huart1.Init.Parity = UART_PARITY_NONE; huart1.Init.Mode = UART_MODE_TX_RX; HAL_UART_Init(&huart1); /* 初始化USART2 */ UART_HandleTypeDef huart2; huart2.Instance = USART2; huart2.Init.BaudRate = 9600; huart2.Init.WordLength = UART_WORDLENGTH_8B; huart2.Init.StopBits = UART_STOPBITS_1; huart2.Init.Parity = UART_PARITY_NONE; huart2.Init.Mode = UART_MODE_TX_RX; HAL_UART_Init(&huart2); ``` 然后,您可以使用HAL_UART_Transmit函数和HAL_UART_Receive函数分别向每个UART发送和接收数据。例如,如果您要向USART1发送数据并从USART2接收数据,请使用以下代码: ``` uint8_t tx_data[] = "Hello, USART1!"; uint8_t rx_data[10]; /* 向USART1发送数据 */ HAL_UART_Transmit(&huart1, tx_data, sizeof(tx_data), HAL_MAX_DELAY); /* 从USART2接收数据 */ HAL_UART_Receive(&huart2, rx_data, sizeof(rx_data), HAL_MAX_DELAY); ``` 请注意,HAL_UART_Transmit和HAL_UART_Receive函数都是阻塞函数,将一直等待直到数据传输完成。如果您希望使用非阻塞方式进行数据传输,可以使用HAL_UART_Transmit_IT和HAL_UART_Receive_IT函数。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值