串口1234使用问题

发布于 2017-04-17 10:42:17
使用的是RTT 2.1.0,开启了4个串口。串口1,2 3都是接设备,调试发现,串口在线程中初始化后,发送时,第一个字节掉了,用串口助手看第一个字节没有收到,后面都是正常 的,请问下为什么。
用的命令和MODBUS上面修改的。

/* ----------------------- Start implementation -----------------------------*/
BOOL xMBPortSerialInit(UCHAR ucPORT, ULONG ulBaudRate, UCHAR ucDataBits,
eMBParity eParity)
{
/**
* set 485 mode receive and transmit control IO
* @note MODBUS_SLAVE_RT_CONTROL_PIN_INDEX need be defined by user
*/
rt_pin_mode(MODBUS_SLAVE_RT_CONTROL_PIN_INDEX, PIN_MODE_OUTPUT);

/* set serial name */
if (ucPORT == 1) {
#if defined(RT_USING_UART1) || defined(RT_USING_REMAP_UART1)
extern struct rt_serial_device serial1;
serial = &serial1;
#endif
} else if (ucPORT == 2) {
#if defined(RT_USING_UART2)
extern struct rt_serial_device serial2;
serial = &serial2;
#endif
} else if (ucPORT == 3) {
#if defined(RT_USING_UART3)
extern struct rt_serial_device serial3;
serial = &serial3;
#endif
}
/* set serial configure parameter */
serial->config.baud_rate = ulBaudRate;
serial->config.stop_bits = STOP_BITS_1;
switch(eParity){
case MB_PAR_NONE: {
serial->config.data_bits = DATA_BITS_8;
serial->config.parity = PARITY_NONE;
break;
}
case MB_PAR_ODD: {
serial->config.data_bits = DATA_BITS_9;
serial->config.parity = PARITY_ODD;
break;
}
case MB_PAR_EVEN: {
serial->config.data_bits = DATA_BITS_9;
serial->config.parity = PARITY_EVEN;
break;
}
}
/* set serial configure */
serial->ops->configure(serial, &(serial->config));

/* open serial device */
if (!serial->parent.open(&serial->parent,
RT_DEVICE_OFLAG_RDWR | RT_DEVICE_FLAG_INT_RX )) {
serial->parent.rx_indicate = serial_rx_ind;
} else {
return FALSE;
}

/* software initialize */
rt_thread_init(&thread_serial_soft_trans_irq,
"slave trans",
serial_soft_trans_irq,
RT_NULL,
serial_soft_trans_irq_stack,
sizeof(serial_soft_trans_irq_stack),
10, 5);
rt_thread_startup(&thread_serial_soft_trans_irq);
rt_event_init(&event_serial, "slave event", RT_IPC_FLAG_PRIO);

return TRUE;
}

在这个基础上修改的。
发送和读是这么写的

serial->parent.write(&(serial->parent), 0, &ucByte, len);


serial->parent.read(&(serial->parent), 0, pucByte, len);

现在就是第一个字符收不到,搞的我读取配置有时不正常,要读多次。后面都正常,就开机第一个字符没了。

查看更多

关注者
0
被浏览
2.5k
8 个回答
bernard
bernard 2017-04-17
和你用的芯片,bsp相关的
Aubr.Cool
Aubr.Cool 2017-04-17
你是用一个串口发,3个收,然后串口调试助手看,第一个发的发出来了,然后收不到吗?
qq_臭小孩
qq_臭小孩 2017-05-05
是怎么同时使用多个串口的,我现在使用一个串口可以,使用多个串口所有串口就都不能用了
lihuiseng
lihuiseng 2017-08-13
usart.c -> stm32_putc() -> while (!(uart->uart_device->SR & USART_FLAG_TC)); 判断USART_FLAG_TC是会丢失第一字节的 改成判断USART_FLAG_TXE似乎可以解决
swcy225@163.com
swcy225@163.com 2017-08-28
初始化完了,读下状态寄电器就好了
pan16309
pan16309 2017-08-28
我的用法是照着系统默认的配置再添加几个,用的时候挂到线程的设备上使用。所有串口挂到console上的时候都很正常,不过挂到device上接收数据总是会异常,好尴尬

撰写答案

请登录后再发布答案,点击登录

发布
问题

分享
好友

手机
浏览

扫码手机浏览