SerialPort控件数据通信

问题描述

我研究了一下SerialPort控件,按照网上的方法写了下面的代码,运行没问题,可以发送数据,但是点击接收数据就卡住没反应了,求教!!代码如下usingSystem;usingSystem.Collections.Generic;usingSystem.ComponentModel;usingSystem.Data;usingSystem.Drawing;usingSystem.Text;usingSystem.Windows.Forms;usingSystem.IO.Ports;namespaceEx13_01{publicpartialclassForm1:Form{publicForm1(){InitializeComponent();}privatevoidbutton1_Click(objectsender,EventArgse){//发送数据serialPort1.PortName="COM1";serialPort1.BaudRate=9600;serialPort1.Open();byte[]data=Encoding.Unicode.GetBytes(txtSend.Text);stringstr=Convert.ToBase64String(data);serialPort1.WriteLine(str);MessageBox.Show("数据发送成功!","系统提示");}privatevoidbutton2_Click(objectsender,EventArgse){//接收数据byte[]data=Convert.FromBase64String(serialPort1.ReadLine());txtReceive.Text=Encoding.Unicode.GetString(data);serialPort1.Close();MessageBox.Show("数据接收成功!","系统提示");}}}

解决方案

解决方案二:
ReadLine方法将阻止线程,直到串口接收到SerialPort.NewLine所指定的值为止你可以设置ReadTimeout,但建议最好使用多线程处理
解决方案三:
卡住了就是线程调用的问题,可以用多线程处理
解决方案四:
能给出代码吗?新手一个谢谢
解决方案五:
SerialPort不能直接调用ReadLine方法,需要用SerialPort的DataReceived事件来接收数据,在DataReceived事件中可以调用ReadLine方法来获取数据。privatevoidbutton1_Click(objectsender,EventArgse){try{ComPort.PortName=comboBox1.Text;ComPort.BaudRate=Convert.ToInt32(cb_BaudRate.Text);ComPort.DataBits=Convert.ToInt32(cb_DataBits.Text);ComPort.Parity=(Parity)cb_Parity.SelectedIndex;ComPort.StopBits=(StopBits)cb_StopBits.SelectedIndex;ComPort.DataReceived+=newSerialDataReceivedEventHandler(ComPort_DataReceived);ComPort.Open();MessageBox.Show("OK");}catch(Exceptionex){showerr(ex.Message);}}voidComPort_DataReceived(objectsender,SerialDataReceivedEventArgse){System.IO.Ports.SerialPortcurrentPort=(System.IO.Ports.SerialPort)sender;if(currentPort==null)MessageBox.Show("端口为空,请检查该设备端口设置设否正确!");if(!currentPort.IsOpen)return;currentPort.NewLine="r";stringCollectionStr=null;try{CollectionStr=currentPort.ReadLine();MessageBox.Show(CollectionStr);}catch(Exceptionex){CollectionStr="";currentPort.DiscardInBuffer();currentPort.DiscardOutBuffer();}}

解决方案六:
4#发的代码是C#的吗?
解决方案七:
引用5楼liquidl的回复:

4#发的代码是C#的吗?

经鉴定是C
解决方案八:
#很明显,先不说别的,这个逻辑都错误了。怎么可能在接受端来关闭Port?接收端应该是接受完毕,返回一个标识给发送端,然后发送端再关闭端口。
解决方案九:
引用7楼ccccffff的回复:

很明显,先不说别的,这个逻辑都错误了。怎么可能在接受端来关闭Port?接收端应该是接受完毕,返回一个标识给发送端,然后发送端再关闭端口。

拜托,这不是TCP/IP4#的代码并不能杜绝线程阻塞的问题。假设串口接收到了字符,DataReceived事件被引发,但若NewLine字符未能收到,仍然会被阻塞在DataReceived中因此,可用4#的代码,但最好使用Read,ReadExisting等还是建议使用多线程处理,MSDN上很多多线程的例子,多线程是必须会的
解决方案十:
我也遇到同样的问题,哎。。

时间: 2024-10-25 23:06:58

SerialPort控件数据通信的相关文章

在WinCE6上,用SerialPort控件做的串口一直在SerialPort.Open()出异常,而在WinForm下却没问题,不知是什么回事?

问题描述 在WinCE6上,用SerialPort控件做的串口一直在SerialPort.Open()出异常,而在WinForm下却没问题,不知是什么回事? 解决方案 解决方案二:是智能设备和PC有区别吧解决方案三:具体是什么异常?一般可能是端口号写错了,或者已经被打开

stm32-用C#SerialPort控件写的四轴飞行器地面站串口部分出了些问题,希望高人指点!

问题描述 用C#SerialPort控件写的四轴飞行器地面站串口部分出了些问题,希望高人指点! 做了一个四轴飞行器地面站,C#写的,用MPU9150来读取姿态,通过串口来向电脑上传输,解决大小BUG后完美运行,后来STM32开发板上的串口坏了,只能改用无限数传来向地面站传输数据,这时程序读的数据全都是跳跃的,有延时的,屏幕显示的那个四轴模型的动作也是一卡一卡的,完全没法用啊,用网上现有的串口程序结合无限数传试了一下,没有传输数据的卡顿啊,到底为什么呢?是C#的SerialPort和无限数传之间的

serialport控件不能发送数据,哪位大侠指导下啊

问题描述 大家好!我是刚接触VB的小白,要用serialport控件给一台串口设备发送数据指令,一直没反应,哪位好心人指点一下,不胜感激!!下面是简单的程序PrivateSubForm1_Load(ByValsenderAsSystem.Object,ByValeAsSystem.EventArgs)HandlesMyBase.LoadSerialPort1.BaudRate=19200'波特率设为19200SerialPort1.PortName="com1"'端口为串口1IfSer

serialPort控件

问题描述 我用serialPort做串口通信,用3个Button实现初始化发送接受的功能初始化serialPort1.PortName="com1";//选择串口COM1serialPort1.BaudRate=9600;//设置通信口参数serialPort1.DataBits=8;//数据位serialPort1.Parity=Parity.None;//校验位 NoneserialPort1.StopBits=StopBits.One;//停止位1位发送byte[]bytesDa

serialPort控件 为什么发送的时候没有数据呢?

问题描述 初始化privatevoidForm1_Load(objectsender,EventArgse){serialPort1.PortName="com1";//选择串口COM1serialPort1.BaudRate=9600;//设置通信口参数serialPort1.DataBits=8;//数据位serialPort1.Parity=Parity.None;//校验位 NoneserialPort1.StopBits=StopBits.One;//停止位1位serialP

VS2005 的SerialPort控件使用问题

问题描述 unsignedcharbuff[1];if(serialPort1->IsOpen){serialPort1->Close();}if(!serialPort1->IsOpen){serialPort1->Open();}serialPort1->Write(S"1");serialPort1->Read(buff,0,1);serialPort1->Close(); "unsignedchar[1]"转换为&q

求教使用C#serialPort串口控件打开一个硬件串口在关闭之后的问题

问题描述 在使用C#serialPort制作的串口调试器过程中发现的问题,希望能够描述清楚也希望有人能知道为什么会这样,假设使用C#串口调试助手打开COM1之后再关闭com1之后直接使用com1口为单片机写程序,这样问题就来了,只是能够正常打开串口但是却永远显示等待单片机响应,只有拔掉USB串口再重插或者使用网上下载的串口调试助手重新打开一次COM1在关闭才可以给单片机写入程序,不知道是什么问题,补充说明下如果不给单片机写程序的话只是使用串口测试收发那一切都正常,无论怎么打开关闭再打开都可以收发

c#2010 没有MSComm控件

问题描述 c#2010 没有MSComm控件 c#2010里没有Microsoft Communication Control version 6.0 控件怎么办 解决方案 C#有原生的serialport控件,不需要mscomm控件.当然非要用,也可以从vb6的安装盘上找一个,注册了放进去.在项目-添加引用-com中添加. 解决方案二: VS2010如何安装MSComm控件 解决方案三: VS2010在默认情况下是不包含MSComm控件的,MSComm是在VC6.0中的控件,据说MSComm控

串口通信-VB在components中添加MSComm控件

问题描述 VB在components中添加MSComm控件 VB中在components添加mscomm控件时为什么会显示"--could not be loaded"??求解...谢谢 解决方案 VB.NET直接用SerialPort控件. 解决方案二: MFC添加两个MSComm控件后提示'CMSComm' : 'class' type redefinition