嵌入式linux中关于485串口方向的控制问题:
[复制链接]
嵌入式linux中关于485串口方向的控制问题:
对于485串口来讲,在默认的方式下是处于A和B电平持平是接受状态,当要发送数据的时候,首先要通过CPU置位操作拉高电平(拉高电平的目的就是为了写操作),然后再写数据,可是会出现这样的情况:由于CPU置位操作很快,当置位结束的时候,就立即开始写数据了,可是在这个时候电平有可能还没有拉高到稳定状态,这样就会导致出现误码。
解决这种问题的思路就是:在CPU置位结束和写数据之间加一个延时
可是由于在我的系统中CPU置位操作和写操作是在中断下进行的,做延时显然是不可以的,不知道有没有更好的方法可以解决。下面是我的程序框架:
static void rs_interrupt(int irq, void *dev_id, struct pt_regs * regs)
{
transmit_char(port);//准备发送数据
}
static inline void transmit_char(struct rs_port *port)
{
while (--count >= 0)
{
status = in_be16(&psc->mpc5xxx_psc_status);
/*
* XXX -df
* check_modem_status(status);
*/
if (!(status & MPC5xxx_PSC_SR_TXRDY))
break;
if (port->x_char) {
out_8(&psc->op1, MPC5xxx_PSC_OP1_RTS) //CPU通过置位拉高电平
out_8(&psc->mpc5xxx_psc_buffer_8, port->x_char);//往串口写数据
port->icount.tx++;
port->x_char = 0;
}
else if (port->gs.xmit_cnt <= 0 ||
(port->gs.tty && (port->gs.tty->stopped ||
port->gs.tty->hw_stopped))) {
break;
}
else {
out_8(&psc->op1, MPC5xxx_PSC_OP1_RTS) //CPU通过置位拉高电平
out_8(&psc->mpc5xxx_psc_buffer_8,
port->gs.xmit_buf[port->gs.xmit_tail++]););//往串口写数据
port->icount.tx++;
port->gs.xmit_tail &= SERIAL_XMIT_SIZE-1;
if (--port->gs.xmit_cnt <= 0) {
break;
}
}
}
在我的程序注释中也就是在CPU拉高电平和往串口写数据之间能加个延时就可以搞定,但是这段代码是在中断下执行的,延时会导致很多问题(因为延时至少需要1MS才不会出现误码),不知道各位高手有没有其他好办法?
|