解决SerialPort串口通信接收指令返回的结果不完整问题

前面在写用SerialPort与串口进行交互的时候,发现指令返回结果过长或者指令返回结果时间有点长的话会导致获取的结果不完整,需要重写DataReceived事件,以获取完整的结果。

代码如下:

这部分代码与C#实现串口通信(SerialPort)_c#串口代码_小橘是橘子的博客-CSDN博客相比增加了设置串口接收与发送的缓冲区,最后部分sp.DataReceived则是设置重写后的DataReceived事件部分。

            string[] ports = System.IO.Ports.SerialPort.GetPortNames();
            InputSimulator simulator = new InputSimulator();
            if (ports.Length == 0)
            {
                MessageBox.Show("本机没有串口!");
            }
            Array.Sort(ports);
            sp.PortName = ports[1];//串口号COM3,根据自己串口选择
            sp.BaudRate = 115200;//波特率
            sp.DataBits = 8;//数据位
            //sp.StopBits = System.IO.Ports.StopBits.One;    //停止位(没用到就先注释掉了)
            sp.WriteTimeout = 3000; //串口发送的超时时间
            sp.ReadTimeout = 18000;//读取数据的超时时间
            sp.Encoding = System.Text.Encoding.GetEncoding("GB2312");//此行非常重要,解决接收中文乱码的问题
            sp.ReadBufferSize = 1024 * 1024;    //串口接收缓冲区大小
            sp.WriteBufferSize = 1024 * 1024;   //串口发送缓冲区大小
            sp.DataReceived += new System.IO.Ports.SerialDataReceivedEventHandler(com_DataReceived);

重写DataReceived事件代码:

        private void com_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
        {
            Thread.Sleep(500);//这个延时非常重要
            System.IO.Ports.SerialPort comPort = (System.IO.Ports.SerialPort)sender;
            Thread.Sleep(500);
            int nRead = sp.BytesToRead;     //指令返回值大小
            Thread.Sleep(500);
            comPort.ReceivedBytesThreshold = comPort.ReadBufferSize;    //设置输入缓冲区的字节数与指令返回字节数一样大小
            Thread.Sleep(500);
            if (nRead > 0)
            {
                byte[] data = new byte[nRead];
                sp.Read(data, 0, nRead);
            }

        }

这里加了休眠,不知道为什么,我这里得加休眠才能获取到完整返回值。。。。

我在这里写的sp.DataRecevied在最前面,但是我在项目中是在发送指令的类中设置的,因为我的指令只有三条是获取不到完整返回值,所以我就在发送指令的时候判断了一下,如果是那几条指令就设置一下,如下图:

各位根据自己不同的需求设置就好了。 

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
要在Java串口通信页面中添加指令,你可以按照以下步骤进行操作: 1. 首先,确保你已经配置好了串口通信所需的依赖库。常用的Java串口通信库有RXTX和jSerialComm等,你可以选择其中一个并将其导入到你的项目中。 2. 创建一个串口管理类,用于打开、关闭和配置串口连接。你可以在该类中添加方法来发送指令接收串口数据。 3. 在你的界面上添加一个文本框或者输入框,用于输入指令。 4. 添加一个按钮或者其他触发事件的组件,当用户点击该按钮时,调用发送指令的方法。 5. 在发送指令的方法中,获取用户输入的指令,并将其发送到已经打开的串口。 下面是一个简单的示例代码,展示了如何添加指令到Java串口通信页面: ```java import gnu.io.*; import java.io.*; public class SerialPortManager { private SerialPort serialPort; public void openPort(String portName, int baudRate) throws Exception { CommPortIdentifier portIdentifier = CommPortIdentifier.getPortIdentifier(portName); if (portIdentifier.isCurrentlyOwned()) { System.out.println("Error: Port is currently in use"); } else { CommPort commPort = portIdentifier.open(this.getClass().getName(), 2000); if (commPort instanceof SerialPort) { serialPort = (SerialPort) commPort; serialPort.setSerialPortParams(baudRate, SerialPort.DATABITS_8, SerialPort.STOPBITS_1, SerialPort.PARITY_NONE); } else { System.out.println("Error: Only serial ports are supported"); } } } public void closePort() { if (serialPort != null) { serialPort.close(); } } public void sendCommand(String command) { try { OutputStream outputStream = serialPort.getOutputStream(); outputStream.write(command.getBytes()); } catch (IOException e) { e.printStackTrace(); } } } ``` 这只是一个简单的示例代码,你可以根据自己的需求进行修改和扩展。希望对你有所帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值