解决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
    评论
### 回答1: Android系统中可以通过串口发送AT指令来与外部设备进行通信。首先需要在Android设备上连接串口通信模块,例如通过USB转串口模块或者直接使用带有串口接口的设备。 在Android应用程序中,首先需要获取串口的文件描述符,可以通过Android的串口API或者使用JNI调用底层的串口库函数来实现。获取到串口的文件描述符之后,就可以通过该描述符来进行串口通信。 接下来就可以发送AT指令了,可以通过串口的文件描述符使用相关的函数进行数据的发送。例如可以使用write函数将AT指令字符串写入串口。在发送之前,需要将字符串转换为字节数组,并添加换行符,因为AT指令通常需要以换行符结尾。 发送完AT指令后,可以通过读取串口的返回数据来获取设备的响应。可以使用read函数从串口中读取数据。通常需要设置一个读取缓冲区,以存储当前接收到的数据。可以通过循环读取的方式,不断读取数据,直到读取到预期的数据或者达到读取超时。 读取到的数据可以进行解析和处理,从中提取出需要的信息。通常AT指令返回数据以换行符结尾,可以通过查找换行符的方式进行分割和解析。 这样,就可以在Android系统中使用串口发送AT指令并处理返回数据了。这种方式可以用于与外部的串口设备进行通信,例如与GSM模块、GPS模块等进行交互。 ### 回答2: Android串口发送AT指令是指在Android设备上通过串口通信向外部设备发送AT指令。AT指令是一种用于控制调制解调器、手机等设备的命令集,广泛应用于通信设备中。通过串口连接设备和Android设备后,可以通过编程控制Android设备向外部设备发送AT指令。 要发送AT指令,首先需要在Android设备上打开串口通信功能。可以使用Android系统提供的SerialPort类库或者一些第三方的串口类库。打开串口后,就可以通过串口对象发送AT指令。 在Android中使用Java语言编写代码,先创建一个串口对象,然后通过串口对象的write方法将AT指令以字节流的形式发送出去。具体的代码如下所示: ``` SerialPort serialPort = new SerialPort(new File("/dev/ttyS1"), 9600, 0); OutputStream outputStream = serialPort.getOutputStream(); String atCommand = "AT+COMMAND\r\n"; outputStream.write(atCommand.getBytes()); outputStream.flush(); ``` 以上代码中,首先创建了一个SerialPort对象,指定了串口设备的文件路径`/dev/ttyS1`,波特率为9600,无奇偶校验位。然后通过`getOutputStream`方法获取串口输出流,并将AT指令以字节流的形式写入输出流中。最后调用`flush`方法将数据发送出去。 通过以上的方法,Android设备就可以通过串口向外部设备发送AT指令了。在发送指令之前,需要确保串口连接正常,设备驱动程序已正确安装,并且AT指令的格式和内容符合设备的要求。发送后,可以通过读取串口的输入流获取设备返回的响应。 ### 回答3: 在Android平台上,我们可以通过串口发送AT指令来与外部设备进行通信。首先,我们需要在Android设备上通过串口连接外部设备,可以使用USB转串口适配器或者直接通过Android设备的串口接口连接。 首先,我们需要获取串口设备的实例并进行初始化设置。使用类似于SerialPort类的串口库,可以实现串口的打开、设置波特率、校验位等参数。接下来,我们可以通过该串口实例来发送AT指令。 在Android中,我们可以使用OutputStream来向串口发送指令。我们首先调用serialPort.getOutputStream()来获取串口的输出流对象。然后,将需要发送的指令转换成字节数组,并通过输出流写入串口进行发送。最后,关闭串口设备,释放资源。 以下是一个示例代码: ```java // 获取串口实例 SerialPort serialPort = new SerialPort(new File("/dev/ttyS0"), 9600, 0); // 获取串口输出流 OutputStream outputStream = serialPort.getOutputStream(); try { // 定义需要发送的AT指令 String atCommand = "AT+CMD\r\n"; // 转换为字节数组 byte[] commandBytes = atCommand.getBytes(); // 发送指令 outputStream.write(commandBytes); outputStream.flush(); // 关闭串口输出流 outputStream.close(); // 关闭串口设备 serialPort.close(); } catch (IOException e) { e.printStackTrace(); } ``` 需要注意的是,发送的指令需要根据外部设备的指令集进行相应的编写和解析。同时,需要确保已经获取了适当的权限来访问串口设备。对于不同的Android设备,串口接口和权限请求可能会有所不同,需要根据具体的设备和操作系统版本进行适配。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值