基于多线程的串口使用,多个串口向同一个串口发送,以及防止发送的串口同时发送多条数据同时发时数据混乱问题。
先贴代码,下面说串口是哪个
代码里用的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
}