rxtx串口事件不触发_工控人写代码(2)之C#串口操作小程序

工作上需要用到上位机进行数据交互,所以就用C#编制了一个简单的串口信息收发程序。界面如下:

b629b4957a85ccfd80ee4cf132d8e4f7.png

开发过程中遇到的一个问题是串口的接收。串口接收大体来说有两个方式,一个是同步读取,也即利用循环不断的读串口缓存,另外一个就是利用事件触发的方式。第一种方法效率低,不推荐,第二种则需要利用到跨线程的内容。本人就是卡在这里一天,其实也就10来句代码的事,无奈自己玩这个没得请教,只有求助万能的百度。经过一天多断续的摸索,终于解决了这个问题。

在贴上代码前,先解释一下代码中会用到的一些控件的名称。

1、 cmbportname:设置串口号的下拉列表

2、 cmbbaudrate:设置波特率的下来列表

3、 bttopenport:打开/关闭串口的动作按钮

4、 txSend:要发送的数据显示文本框

5、 bttSend:发送那妞

6、 txrecieve:接收到的数据显示文本框

7、 bttClear:清空接收数据的按钮

涂黄的代码关系到异步接收数据,只要照着那几个涂黄的代码改一下,应该就可以实现了功能了。需要完整代码的也可以发邮件给我,。

代码中的SP是从工具箱拖进来的一个serialport控件。

代码:

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Linq;

using System.Text;

using System.Windows.Forms;

using System.IO.Ports;

namespace WindowsFormsApplication1

{

public partial class Form1 : Form

{

public Form1()

{

InitializeComponent();

}

public delegate void getstring(string dataRe);//定义委托

getstring getmystring;//定义委托变量

private void DoUpdate(string data)

{

tbRecieve.Text = tbRecieve.Text + data;//数据处理,将当前数据与文本框文本合并

if (label5.BackColor == Color.AliceBlue)//改变lable的颜色,提示收到数据

{

label5.BackColor = Color.Black;

}

else label5.BackColor = Color.AliceBlue;

}

void SP_DataReceived(object sender, SerialDataReceivedEventArgs e)//接收事件触发方法

{

try

{

string mystring = SP.ReadExisting();

getmystring = new getstring(DoUpdate);

Invoke(getmystring, mystring);

}

catch (Exception EX)

{

MessageBox.Show(EX.Message, "出错

好的,下面是一个简单的基于RXTX串口通信的Java程序示例: ```java import gnu.io.*; import java.io.*; import java.util.Enumeration; public class SerialPortCommunication implements SerialPortEventListener { private SerialPort serialPort; private InputStream inputStream; private OutputStream outputStream; private static final int TIME_OUT = 2000; // 等待超时时间 private static final int DATA_RATE = 9600; // 串口数据传输速率 public void initialize() { CommPortIdentifier portId = null; Enumeration portEnum = CommPortIdentifier.getPortIdentifiers(); // 遍历所有可用串口,找到指定的串口 while (portEnum.hasMoreElements()) { CommPortIdentifier currPortId = (CommPortIdentifier) portEnum.nextElement(); if ("COM3".equals(currPortId.getName())) { portId = currPortId; break; } } if (portId == null) { System.out.println("找不到指定的串口"); return; } try { // 打开串口,设置参数 serialPort = (SerialPort) portId.open(this.getClass().getName(), TIME_OUT); serialPort.setSerialPortParams(DATA_RATE, SerialPort.DATABITS_8, SerialPort.STOPBITS_1, SerialPort.PARITY_NONE); // 获取输入输出流 inputStream = serialPort.getInputStream(); outputStream = serialPort.getOutputStream(); // 添加串口事件监听器 serialPort.addEventListener(this); serialPort.notifyOnDataAvailable(true); } catch (PortInUseException | UnsupportedCommOperationException | IOException | TooManyListenersException e) { e.printStackTrace(); } } // 发送数据 public void sendData(String data) { try { outputStream.write(data.getBytes()); } catch (IOException e) { e.printStackTrace(); } } // 读取数据 public void serialEvent(SerialPortEvent evt) { if (evt.getEventType() == SerialPortEvent.DATA_AVAILABLE) { try { int availableBytes = inputStream.available(); byte[] bytes = new byte[availableBytes]; inputStream.read(bytes, 0, availableBytes); String data = new String(bytes); System.out.println("接收到数据:" + data); } catch (IOException e) { e.printStackTrace(); } } } public static void main(String[] args) { SerialPortCommunication serialPortCommunication = new SerialPortCommunication(); serialPortCommunication.initialize(); serialPortCommunication.sendData("Hello World!"); } } ``` 这个程序可以初始化一个串口,设置参数,发送和接收数据。其中,`initialize()` 方法中的 `COM3` 是指定的串口名称,需要根据实际情况修改。在 `main` 方法中,我们初始化了一个 `SerialPortCommunication` 对象,并发送了一个字符串 "Hello World!"。你可以根据自己的需求修改该程序。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值