串口接收为什么每次重复上次显示

串口接收为什么每次重复上次显示,第1张

串口接收每次重复上次显示原因,首先是不涉及到底层语言的,普通的PLC和其他内置好modbus协议的设备,只需要确认好通讯的起始地址和读取个数,很容易就能够建立起通讯,得到你想要的数据;其次是涉及到C或者C#等编程语言的通讯,例如PLC直接和电脑进行通讯,首先确认好硬件接口,是走485还是232的,硬件通讯建立好

同一台机只能有一个程序打开串口,自发自收的串口数据,可以将串口的2、3针脚短接,然后再对串口写数据,同时再读串口即可,读写串口可参看MSDN, system.io.ports.serialport 的C#代码

public static void Main()

{

string name

string message

StringComparer stringComparer = StringComparer.OrdinalIgnoreCase

Thread readThread = new Thread(Read)

// Create a new SerialPort object with default settings.

_serialPort = new SerialPort()

// Allow the user to set the appropriate properties.

_serialPort.PortName = SetPortName(_serialPort.PortName)

_serialPort.BaudRate = SetPortBaudRate(_serialPort.BaudRate)

_serialPort.Parity = SetPortParity(_serialPort.Parity)

_serialPort.DataBits = SetPortDataBits(_serialPort.DataBits)

_serialPort.StopBits = SetPortStopBits(_serialPort.StopBits)

_serialPort.Handshake = SetPortHandshake(_serialPort.Handshake)

// Set the read/write timeouts

_serialPort.ReadTimeout = 500

_serialPort.WriteTimeout = 500

_serialPort.Open()

_continue = true

readThread.Start()

Console.Write("Name: ")

name = Console.ReadLine()

Console.WriteLine("Type QUIT to exit")

while (_continue)

{

message = Console.ReadLine()

if (stringComparer.Equals("quit", message))

{

_continue = false

}

else

{

_serialPort.WriteLine(

String.Format("<{0}>: {1}", name, message) )

}

}

readThread.Join()

_serialPort.Close()

}

public static void Read()

{

while (_continue)

{

try

{

string message = _serialPort.ReadLine()

Console.WriteLine(message)

}

catch (TimeoutException) { }

}

}

在使用串口接收数据时,当数据量大的时候会出现数据接收不完整的情况。因为串口数据获取函数readAll()由readyRead()信号触发,但readyRead()信号在串口读到起始标志时立即发送,并不保证一定是当前所发数据的起始部分。因此串口通信双方在通信前应制定好通信协议,规定好数据的起始和结束标志,串口当读到完整的起始和结束标志之后,才认定读完一条完整的数据。

本例中用串口定时发送当前时间,用"#"表示数据的结尾,定时时间为0毫秒,即能发多快就发多快。

//发送

[cpp] view plain copy

void Widget::slotSendData()

{

QByteArray temp

temp.append(getCurrentTime())

temp.append("#")

serialPort->write(temp)

}

//接收

[cpp] view plain copy

void Widget::slotReadData()

{

QByteArray temp = serialPort->readAll()

if(!temp.isEmpty())

{

byteArray.append(temp)

if(byteArray.contains("#"))

{

ui->textEditReceive->setText(byteArray.split('#').at(0))

byteArray = byteArray.right(byteArray.length()-byteArray.indexOf('#')-1)

}

}

}


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/sjk/6734750.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-03-27
下一篇 2023-03-27

发表评论

登录后才能评论

评论列表(0条)

保存