C#读写串口数据,读不到

良才2015 2011-11-11 02:47:11
如题,代码如下:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.IO.Ports;

namespace WindowsApplication1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();


}
SerialPort port1=new SerialPort();


//接收数据
private void port_DataReceived(object sender, SerialDataReceivedEventArgs e)
{

// 读取缓冲区的数据
string data = port1.ReadExisting();
textBox1.Text = data;
}


//初始化SerialPort对象方法.PortName为COM口名称,例如"COM1","COM2"等,注意是string类型
public void InitCOM(string PortName)
{
port1 = new SerialPort(PortName);
port1.BaudRate = 9600;//波特率
port1.Parity = Parity.None;//无奇偶校验位
port1.StopBits = StopBits.One;//两个停止位
port1.DataBits = 8;
}
//DataReceived事件委托方法
private void port1_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
// 读取缓冲区的数据
string data = port1.ReadExisting();
textBox1.Text = data;
}

//打开串口的方法
public void OpenPort()
{
try
{
port1.Open();
}
catch
{

}
if (port1.IsOpen)
{
Console.WriteLine("the port is opened");
}
else
{

Console.WriteLine("failure to open the port");
}

}

//关闭串口
public void ClosePort()
{
port1.Close();
if (!port1.IsOpen)
{
Console.WriteLine("the port is already closed");
}

}

//向串口发送数据
public void SendCommand(string CommandString)
{
port1.Write(CommandString);
//Console.WriteLine(port1.ReadExisting());
textBox1.Text = port1.ReadExisting();
}


private void button1_Click(object sender, EventArgs e)
{
if (!port1.IsOpen)
{
InitCOM("COM1");
OpenPort();
}
SendCommand("abcdefg");
}

private void button2_Click(object sender, EventArgs e)
{
port1.Close();
}

private void Form1_Load(object sender, EventArgs e)
{
port1.DataReceived += new SerialDataReceivedEventHandler(port1_DataReceived);// new SerialDataReceivedEventHandler(port_DataReceived);

}
}
}
...全文
533 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
良才2015 2011-11-15
  • 打赏
  • 举报
回复
问题已经解决,总结下,以备后来人用。
其实上面的代码没有什么大的问题,只是我没有用真实的外围设备进行传输数据,一直以为我点击button后send信息,就能出发datareceived事件。后来使用了串口调试小工具(已经传到我的资源中,免费的,地址是http://download.csdn.net/detail/hanjiaming/3793951),可以进行串口的调试了,可以触发datareceived事件了。只是,如果要在界面上显示出来,确实像9楼说的要用Invoke。

另外,非常感谢chzadm的热心帮助。
帮帮你我她 2011-11-12
  • 打赏
  • 举报
回复
另外如果你使用异步调用,和线程池,或开START线程的办法,则可以直接获得UI的权利,可以直接去显示
帮帮你我她 2011-11-11
  • 打赏
  • 举报
回复 1

public delegate void RecieveRefreshTextDelegate(byte[] inbytes);
//声明委托
//定义一个委托实例
RecieveRefreshTextDelegate RecieveRefresh = new RecieveRefreshTextDelegate(RecieveRefreshText);

//定义一个实例方法
public void RecieveRefreshText(byte[] inbytes)
{
ShowRecieveData(inbytes);
}

private void ShowRecieveData(byte[] inbytes)
{
try {
ReceiveCount += inbytes.Length;
//接收数据累计个数
comjslj.Text = ReceiveCount.ToString;
//接收计数
byte bytes_temp = 0;
System.Text.StringBuilder instrs_temp = new System.Text.StringBuilder();
if (HexRecieveFlag) {
foreach (byte bytes_temp_loopVariable in inbytes) {
bytes_temp = bytes_temp_loopVariable;
instrs_temp.Append(String.Format("{0:X2} ", bytes));
}
TextBoxRecieve.AppendText(instrs_temp.ToString());
}
// ex As Exception
} catch {
}
}



// 数据接收
private void SerialPort_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
{
try {
int inDataLen = SerialPort.BytesToRead();
//缓冲区收到的个数
if (inDataLen > 0) {
byte[] inBytes = new byte[inDataLen];
SerialPort.Read(inBytes, 0, inDataLen);
//读取缓冲区
TextBoxRecieve.Invoke(RecieveRefresh, inBytes);
//显示出来--同步委托
}
//ex As Exception
} catch {
}
}


帮帮你我她 2011-11-11
  • 打赏
  • 举报
回复
要用委托才能显示出来,而委托你要预先定义,然后使用
fengxuan0312 2011-11-11
  • 打赏
  • 举报
回复
同意11楼,我也觉得楼主应该先用串口调试助手,看看串口的波特率之类的设置是否正确。
jacikafx 2011-11-11
  • 打赏
  • 举报
回复
先下个串口工具试试 ,还有串口的校验方式等的设置是否正确!
良才2015 2011-11-11
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 sp951 的回复:]
C# code


public void SendCommand(string CommandString)
{
port1.Write(CommandString);
//Console.WriteLine(port1.ReadExisting());
textBox1.Text = port1.ReadExisting();
}


串口都是即时读取,你……
[/Quote]

本人新手,请问下,
//向串口发送数据
public void SendCommand(string CommandString)
{
port1.Write(CommandString);
//Console.WriteLine(port1.ReadExisting());

}
还是这样写吗,也就是往port1中写数据,然后用你说的com3(sp)去读?
兔子-顾问 2011-11-11
  • 打赏
  • 举报
回复
更新界面要用this.Invoke
sp951 2011-11-11
  • 打赏
  • 举报
回复
按钮事件加上这两句
Thread thread = new Thread(new ThreadStart(this.ReadData));
thread.Start();
sp951 2011-11-11
  • 打赏
  • 举报
回复
  
public void SendCommand(string CommandString)
{
port1.Write(CommandString);
//Console.WriteLine(port1.ReadExisting());
textBox1.Text = port1.ReadExisting();
}

串口都是即时读取,你这里发送,再读。信息已经丢失。还有你这里读写都是同一个对象。
应该先读(应该说监听)再写
因为同步读写,所以用多线程读写

private void button1_Click(object sender, EventArgs e)
{
if (!port1.IsOpen)
{
InitCOM("COM1");
OpenPort();
}
SendCommand("abcdefg");
}

private void ReadData()
{
SerialPort sp = new SerialPort("COM3");

try
{
sp.Open();
string msg = sp.ReadLine();
MessageBox.Show(msg);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
finally
{
sp.Close();
}
}
mabaolin 2011-11-11
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 hanjiaming 的回复:]
引用 1 楼 yuwenge 的回复:
线插好没
这个我不用插线的,我是直接将一组字符串写到了串口了。
[/Quote]
不插线怎么接受数据? 除非用串口模拟工具。lz确认一下。
allen0118 2011-11-11
  • 打赏
  • 举报
回复
我写了一个小例子,是两个端口之间互相通信的,你参考一下看有没有用。

http://download.csdn.net/detail/chenpeng0118/3674528
良才2015 2011-11-11
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 yuwenge 的回复:]
线插好没
[/Quote]这个我不用插线的,我是直接将一组字符串写到了串口了。
山东蓝鸟贵薪 2011-11-11
  • 打赏
  • 举报
回复
没试过,帮你顶顶
卧_槽 2011-11-11
  • 打赏
  • 举报
回复
线插好没

110,533

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧