C#串口通信问题

怎么使串口通信里datareceive,接收通信动作,一直处于接收,除非点了一个button后,才停止接收数,并把接收到的数据在button里操作,请问应该怎么做啊!! 谢
怎么实现程序一直处于 “开启状态”,使有数据来的时候就显示,没数据的时候就“待机” 同时有数据来时就把前一数据覆盖。。。

第1个回答  推荐于2016-10-27
//自动接收串口缓冲区的数据;
mycomm是串口名,DataReceived是接收的事件;
System.IO.Ports.SerialDataReceivedEventArgs 将导致该该事件被触发;

private void mycomm_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
{
int DataLength = mycomm.BytesToRead;//获取接受缓冲区中数据的字节数
int i = 0;
StringBuilder strb = new StringBuilder();
while (i < DataLength)
{
byte[] dbs = new byte[2048];
int len = mycomm.Read(dbs,0,2048);//每次从输入缓冲区中读取2048个字节,并将这些字节写入到dbs[]数组中
strb.Append(ASCIIEncoding.GetEncoding("gb2312").GetString(dbs, 0, len));
i += len;
}
revtext.Text += strb;// revtext.Text 将显示接收到的数据
}追问

大神:按着做没用啊 不显示!!
串口发过来的数据是“01 01 01 01 01”“02 02 02 02 02”
怎么可以使他们在textBox中显示出来啊!! 我可以做一个,两个就做不起来了,求教!!
我意思就是串口在循环的发送,我想把这些数据在textBox循环的显示
就是
假如第一时刻显示“01 01 01 01 01”
第二时刻“02 02 02 02 02”

追答

刚才不是写了注释的吗?revtext.Text 将显示接收到的数据,revtext是一个textBox控件
revtext.Text += strb;// revtext.Text 将显示接收到的数据

“假如第一时刻显示01 01 01 01 01
第二时刻02 02 02 02 02“” 你要用一个Timer控件
在Timer.Tick 事件里写接收方法,最后把Timer.Tick 挂载到mycomm_DataReceived事件就行了

private void Form1_Load(object sender, EventArgs e)
{
timer1.Enabled=true;
timer1.Interval=100//两个时刻的间隔 单位是毫秒,大小你自己设定
timer1.Start();
}
//挂载Timer事件
private void mycomm_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
{
this.timer1.Tick += new System.EventHandler(this.timer1_Tick);
}
private void timer1_Tick(object sender, EventArgs e)
{
//调用接收数据的方法就是了
Received();
}
//接收数据的方法
private void Received()
{
int DataLength = mycomm.BytesToRead;//获取接受缓冲区中数据的字节数
int i = 0;
StringBuilder strb = new StringBuilder();
while (i < DataLength)
{
byte[] dbs = new byte[2048];
//每次从输入缓冲区中读取2048个字节,并将这些字节写入到dbs[]数组中
int len = mycomm.Read(dbs,0,2048);
strb.Append(ASCIIEncoding.GetEncoding("gb2312").GetString(dbs, 0, len));
i += len;
//"01 01 01 01 01"或者"02 02 02 02 02"都是14个字节
if((len%28)<=14)
textBox1.Text += strb;// 按照你的思路,改名为textBox1.Text 将显示接收到的数据
else
textBox2.Text += strb;// 按照你的思路,改名为textBox2.Text 将显示接收到的数据
}
}

本回答被提问者采纳

C# 串口通信问题
1、USB串口线的信号传输不标准,写可能还好,读就不敢保证很好,我建议你就用串口线,两头都串口的。2、用SerialPort读是可以读的,看你读的方法对不对。private SerialPort m_Port = new SerialPort(portName, SerialConfiguration.WaveDetectorBaudRate, Parity.None, 0);\/\/SerialConfiguration.WaveDe...

c#串口通信中,拔掉串口然后在插入串口,软件会卡顿,怎么解
在C#串口通信过程中遇到拔掉串口然后插入后软件卡顿的问题,通常是由未进行合理异常捕获导致的。解决此问题,推荐直接访问git仓库获取我开发的串口助手SComTool1.0,该工具能有效帮助调试和管理串口通信。访问地址:[SComTool1.0下载](github.com\/FenDouBi\/ser...)使用串口助手时,请参考其界面设计,确...

C# serialport类编写串口通信程序,无法接收全部数据!
bytesRead = serialPort.Read(BRecieve, 0, bytesToRead);楼上的说法有点意思,但是不完全透彻。其实问题在于串口返回数据时,它返回的速度可能不会太快,而程序执行是非常快的。也就是说,当执行到Read语句时,串口根本没来得及返回那么多的数据,如你说的,只返回了9个字节。即便你指定bytesToRead大小...

C# 串口通信问题 我在接收到数据并处理完之后 在txtsend 中会有要发送...
1.你在serialPort1_DataReceived处理事件处理完得到一个返回值(发送值)紧接着就写发送代码 2.你也可以将发送部分写一个方法,在处理完得到返回值时调用发送方法,并把返回值传给发送方法.当然你也可以做成事件,只需要验证返回值有效就触发事件.

C# 串口通信 使用SerialPort类的DataReceived事件接收的数据不完整...
1.你可以在接收事件函数的开始位置延迟一段时间,根据数据长度的不同可以适当改变延迟的时间。2.根据你接收的数据格式可以使用不同的Read方法。ReadTo()方法是直到读到相应的字符为止,ReadLine()方法是读到一个新行,Read()读取缓冲区的字节数。希望对你有帮助。不懂的话可以继续问。

C#串口通信,为什么单步调试输入大于8个字符,可以收到,但是直接运行输入...
因为serialPort1.DataBits默认是8位,如果你需要增加长度,就要修改他

C#中的串口通信SerialPort
C#中的串口通讯使用的是System.IO.Ports.SerialPort类。通过简单操作步骤,很容易实现串口的信息收发程序,从特定串口中接收数据并发送数据。串口的使用通常与线程结合,在子线程中进行耗时和重复工作,主线程或界面则负责数据展示处理。打开和关闭串口状态需在子线程处理过程中特别注意,以防出现无法捕获的...

C# 串口通信,serialport里的数据只读了一部分。
告诉你 下位机发过来的串口数据并不一定是一次全部能收到的,要知道电脑的总线速度远高于普通单片机和arm。所以很多仪器才设有握手协议,在数据头尾设有标记。就是为了解决电脑和下位机的同步问题。一般来说判断从下位机接收数据的方式要么是根据超时判断数据接收完结,要么是根据接收到头尾标记。所以程序...

C# 串口通讯,出现间隔无数据返回的情况。
加入调试信息,监测发送和接收的时间差,看看有没有上次接收和下次发送的时间差越来越近的情况,如果有,那就是数据发生了冲突,造成某一方数据不完整,从而造成通信失败。查查原因吧。

c#控制台程序,串口通信运行报错System.InvalidOperationException...
改造方法一:int n = com.BytesToRead 前面加一句 SerialPort com=Sender as SerialPort ;int n = com.BytesToRead ...然后把你的 class Progam 后面的哪个全局SerialPort 对象去掉了!改造方法二:或者你把你man方法的中的对象传到Progam 类中也可以 Progam P=new Progam ();P.com=com;com...

相似回答