所有这些都来自我想在.Net中使用 SerialPort类的想法,但唯一的方法是调用dll。因为我只能从调用此dll的程序中获取接口。 mycode在下面。
我写了一篇关于serialport的课程,
public class CommClass
{
public SerialPort _port;
private string _receivedText;
public string receivedText
{
get { return _receivedText; }
set
{
_receivedText = value;
}
}
public CommClass(string _pname)
{
portList = SerialPort.GetPortNames();
_port = new SerialPort(portList[0]);
if (portList.Length < 1)
_port= null;
else
{
if(portList.Contains(_pname.ToUpper()))
{
_port = new SerialPort(_pname);
_port.DataReceived += new SerialDataReceivedEventHandler(com_DataReceived);
}
}
}
private void com_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
string indata = _port.ReadExisting();
receivedText = indata;
}
}
来自 Bytestoread 我可以看到有数据进来,我可以从端口获取数据。 ReadExisting(),但是receiveText没有改变,它没有点击 SerialDataReceived事件。我的方式错了吗?有什么建议吗?谢谢
我从CommClass创建了一个dll,然后我在我的winform程序中调用它,该程序有一个按钮和一个文本框。单击按钮,然后初始化端口
public Form1()
{
InitializeComponent();
}
public CommClass mycom;
private void button1_Click(object sender, EventArgs e)
{
mycom = new CommClass("com3");
mycom._port.Open();
textbox.Text=mycom.receivedText;//i add a breakpoint at this line ,
}
点击它时,我检查mycom._port.PortName是“com3”,它的IsOpen()是“打开”,我使用虚拟端口发送数据。我发送“1111”,然后检查mycom._port.BytestoRead
是4,mycom._port.ReadExisting()
是“1111”,但mycom.receivedText为空。我的难题是我不知道数据何时到来。如何在我的winform中使用DataReceived
事件而不使用代码“使用System.Io.Ports ”,只需使用参考CommClass.dll
。我说清楚了吗?谢谢你的帮助。
答案 0 :(得分:1)
mycom._port.Open();
textbox.Text=mycom.receivedText;//i add a breakpoint at this line ,
该代码无法正常工作,它是一个线程竞争错误。打开端口后,DataReceived事件不会立即触发 。它需要一微秒左右,给予或接受。线程池线程必须开始触发事件。当然,设备实际上必须发送一些东西,它们通常只在你首先发送东西时这样做。
显然没有发生,您的DataReceived事件处理程序也有错误。由于它在工作线程上运行,因此不允许更新该事件中控件的Text属性。您的程序将使用InvalidOperationException进行轰炸。
你必须写下这样的东西:
private void com_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
string indata = _port.ReadExisting();
this.BeginInvoke(new Action(() => {
textbox.AppendText(indata);
}));
}
有了额外的规定,你不能这样做,更新TextBox的Text属性并使其在屏幕上可见是一项昂贵的操作,当设备启动时,它会使你的用户界面紧张变通以高速率传输数据。