问题描述
我研究了一下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上很多多线程的例子,多线程是必须会的
解决方案十:
我也遇到同样的问题,哎。。