This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

串口接收延迟问题

Other Parts Discussed in Thread: MSP430F149, MSP430F2132

        我使用MSP430F149发送数据,MSP430F2132接收149发送来的数据,通讯波特率为9600,149的P3.6和2132的P2.2相连,我的通讯格式是:149 要发送数据前先将P3.6设置为高电平,表示要发送数据,当发送完成时立即拉低P3.6,表示数据发送完成;2132 作为接收方(使用中断方式接收),当检测到与149连接的管脚P2.2为高时才会将接收寄存器UCA0RXBUF数据存入相应数据中。

        在实际使用上述方式会出现一个问题,2132无法接收到149最后发来的两字节(byte)的数据;后来我让149串口发送完成后延时3ms再拉低P3.6管脚,2132即可接收全部数据(延时2ms还有一个字节数据无法接收),怎么会出现这样的问题,能不能解释一下

注:为了减少延迟,我将149和2132的串口管脚直接相连,没有使用串口转换芯片。

  • 你是用的msp430的内置串口模块进行的串口通讯吧?

    对于程序来说,只是把数据放到串口发送缓存寄存器,然后由硬件自动发送出去。这个过程会有一个延迟。

    对于9600波特率,大约1mS多一点才能发送一个字节。

  • 楼上已经给出了发生一个字节(8bit+start+stop 至少10bit)需要1ms多一点的时间,

    从你的描述来看,需要了解的是

    1. 发送时软件模拟还是硬件buffer发送? 在检测到什么条件才拉低引脚电平告诉接收方已经发送结束

    2.接收方是在什么时候停止接收的,是管脚中断检测到就立即停止中断,还是等判断接收完成才停止接收.

  • 1.我使用的是硬件buffer发送,当检测到最后一个字符发送完成后拉低电平告诉接收方已经发送完成,发送函数如下:

    void Send_Byte(uchar data)
    {
        while((IFG2&UCA0TXIFG)==0);     //发送寄存器空的时候发送数据
            UCA0TXBUF = data;
    }

    当我检测到UART0的UCA0TXIFG位置1时才会拉低电平告诉接收方已经发送完成。

    2.接收方在中断检测到管脚为低时即停止接收

    我好像明白了,说出来大家看一下对不对。

    之所以还有2个字节数据没有接收到是因为这2个字节数据存储在Transmit Shift Register和Transmit Buffer UxTXBUF中,还未通过UART口发送出来

    是这样理解的吗?

  • 当然发送器还会继续发送这2字节的数据,但因为发送器直接将管脚拉低,接收器因为检测到管脚中断而没有接受这2字节数据。