感芯MC3172串口使用

基于多线程的串口使用,多个串口向同一个串口发送,以及防止发送的串口同时发送多条数据同时发时数据混乱问题。

先贴代码,下面说串口是哪个

 代码里用的PCOM8和PCOM9,手册里面每个PCOM分别有4个引脚,这里只用了P2和P3.

 关于P2,P3手册里有表格,PORTC6就是PC6引脚,GPCOM8-P2就是代码里面用到的串口的输入脚也就是PC2,输出脚是GPCOM9-P3也就是PC7.

 

 

 

 

 

 刚开始试的时候发送串口在同时发送时有数据混乱两条数据撞了的情况,于是用了个最笨的方法解决了一下,在数据发送之前判断一下这个标志位,发送完之后把标志位=0即可

 

 这是同一个串口同时发送多条多个串口传回来的数据定时100MS发送,数据无混乱。

可以根据自己的需求更改串口引脚,直接调用函数即可,把P2和P3改成P0和P1就可以以用同一组COM里面的另外一组串口引脚,可以根据手册自行更改。

void USART8ZUART9(u32 a,u32 b)//a串口RX接受,b串口TX发送。
{
    INTDEV_SET_CLK_RST(a,(INTDEV_RUN|INTDEV_IS_GROUP0|INTDEV_CLK_IS_CORECLK_DIV4));//这个宏用于对外设进行启动

    INTDEV_SET_CLK_RST(b,(INTDEV_RUN|INTDEV_IS_GROUP0|INTDEV_CLK_IS_CORECLK_DIV4));//这个宏用于对外设进行启动

    GPCOM_SET_IN_PORT(a,(GPCOM_RXD_IS_P2));//这个宏用于设置 为输入管脚

    GPCOM_SET_OUT_PORT(b,( \
                GPCOM_P0_OUTPUT_DISABLE|GPCOM_P3_OUTPUT_ENABLE|GPCOM_P2_OUTPUT_DISABLE|GPCOM_P1_OUTPUT_DISABLE| \
                GPCOM_P0_IS_HIGH       |GPCOM_P3_IS_TXD       |GPCOM_P2_IS_HIGH       |GPCOM_P1_IS_HIGH \
                          ));//这个宏用于设置 为输出管脚

    GPCOM_SET_COM_MODE(a,GPCOM_UART_MODE);//这个宏用于设置通信接口的工作模式为 UART 模式

    GPCOM_SET_COM_SPEED(a,12000000,115200);//这个宏用于设置串口的工作速度,12000000 是该外设的实际时钟频率,115200 是串口速率,可按需更改

    GPCOM_SET_COM_MODE(b,GPCOM_UART_MODE);//这个宏用于设置通信接口的工作模式为 UART 模式

    GPCOM_SET_COM_SPEED(b,12000000,115200);//这个宏用于设置串口的工作速度,12000000 是该外设的实际时钟频率,115200 是串口速率,可按需更改

    GPCOM_SET_OVERRIDE_GPIO(a, ( \
                GPCOM_P2_OVERRIDE_GPIO|GPCOM_P2_INPUT_ENABLE | \
                GPCOM_P3_OVERRIDE_GPIO \
                                                  ));//这个宏用于设置串口管脚映射

    GPCOM_SET_OVERRIDE_GPIO(b, ( \
               GPCOM_P2_OVERRIDE_GPIO|GPCOM_P2_INPUT_ENABLE | \
               GPCOM_P3_OVERRIDE_GPIO \
                                                 ));//这个宏用于设置串口管脚映射
#ifdef TEST_ONLY_UART_TX
    while(1){
        while(GPCOM_TX_FIFO_FULL(b));//这个宏用于检查 TX 的发射缓存是否已满。
        for (u32 var = 0; var < 90; ++var) {
            NOP();
        }
        GPCOM_PUSH_TX_DATA(b,0x31);AT+AT_EXIT//这个宏用于把 tx_data 送入 TX 发射缓存

    }//用于查看发送缓存

#else
    u8 rx_data_rp=0;
    u8 rx_data=0;
    rx_data_rp=GPCOM_GET_RX_WP(a);//这个宏用于读取当前 RX 的缓存 FIFO 写指针
    if (date==0){
    while(1) {
         if(rx_data_rp!=(GPCOM_GET_RX_WP(a))){
              rx_data=GPCOM_GET_RX_DATA(a,rx_data_rp);//这个宏用于读取当前 RX 的缓存 FIFO 读指针 rx_data_rp 指向的数据。
              GPCOM_PUSH_TX_DATA(b,rx_data);//这个宏用于把 tx_data 送入 TX 发射缓存。
              rx_data_rp++;
              rx_data_rp&=0x0f;
         }
    }
   }
    date=0;
#endif
        }

 
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值