C#串口实时监听

zhybbs 2010-03-27 02:08:55
因为是搞电控的,但是项目要用C#,在winCE下运行,在网上下了段API 读写串口的程序,打开串口和写串口都没问题;希望串口有数据时可以实时监听到,但是不知道怎么写实时监听串口的部分,请大家帮帮忙,
一,串口操作类主要内容
public bool OpenPort(string lpFileName,int baudRate,byte parity, byte byteSize, byte stopBits)
{
// OPEN THE COMM PORT.
hComm = CreateFile(lpFileName ,GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_EXISTING, 0, 0);
// IF THE PORT CANNOT BE OPENED, BAIL OUT.
if(hComm == INVALID_HANDLE_VALUE)
{
return false;
}

SetupComm(hComm, MAXBLOCK, MAXBLOCK);

// SET THE COMM TIMEOUTS.
COMMTIMEOUTS ctoCommPort = new COMMTIMEOUTS();
GetCommTimeouts(hComm,ref ctoCommPort);
ctoCommPort.ReadIntervalTimeout = Int32.MaxValue;
ctoCommPort.ReadTotalTimeoutConstant = 1000;
ctoCommPort.ReadTotalTimeoutMultiplier = 0;
ctoCommPort.WriteTotalTimeoutMultiplier = -1;
ctoCommPort.WriteTotalTimeoutConstant = 1000;
SetCommTimeouts(hComm,ref ctoCommPort);


DCB dcbCommPort = new DCB();
dcbCommPort.DCBlength = Marshal.SizeOf(dcbCommPort);
GetCommState(hComm, ref dcbCommPort);
dcbCommPort.BaudRate = baudRate;
dcbCommPort.Parity = parity;

dcbCommPort.fBinary = 0;
dcbCommPort.fParity = 0;
dcbCommPort.ByteSize = byteSize;
dcbCommPort.StopBits = stopBits;
dcbCommPort.fOutxCtsFlow = 0;
dcbCommPort.fOutxDsrFlow = 0;
dcbCommPort.fRtsControl = 1;
dcbCommPort.fDtrControl = 1;


SetCommState(hComm, ref dcbCommPort);
PurgeComm(hComm, PURGE_RXCLEAR | PURGE_RXABORT);
PurgeComm(hComm, PURGE_TXCLEAR | PURGE_TXABORT);

bOpened = true;
return true;
}

// 关闭串口
public bool ClosePort()
{
if (hComm == INVALID_HANDLE_VALUE)
{
return false;
}

if (CloseHandle(hComm))
{
hComm = INVALID_HANDLE_VALUE;
bOpened = false;
return true;
}
else
{
return false;
}
}

// 往串口写数据
public bool WritePort(byte[] WriteBytes,int dwLen)
{
if (hComm == INVALID_HANDLE_VALUE)
{
return false;
}

COMSTAT ComStat = new COMSTAT();
int dwErrorFlags = 0;

ClearCommError(hComm, ref dwErrorFlags, ref ComStat);
if (dwErrorFlags != 0)
PurgeComm(hComm, PURGE_TXCLEAR | PURGE_TXABORT);

OVERLAPPED ovlCommPort = new OVERLAPPED();
int BytesWritten = 0;

return WriteFile(hComm, WriteBytes, dwLen, ref BytesWritten, ref ovlCommPort);
}


// 从串口读数据
public int ReadPort(int NumBytes, byte[] commRead)
{
if (hComm == INVALID_HANDLE_VALUE)
{
return 0;
}

COMSTAT ComStat = new COMSTAT();
int dwErrorFlags = 0;

ClearCommError(hComm, ref dwErrorFlags, ref ComStat);
if (dwErrorFlags != 0)
{
PurgeComm(hComm, PURGE_RXCLEAR | PURGE_RXABORT);
}

if (ComStat.cbInQue > 0)
{
OVERLAPPED ovlCommPort = new OVERLAPPED();
int BytesRead = 0;
ReadFile(hComm, commRead, NumBytes, ref BytesRead, ref ovlCommPort);
return BytesRead;
}
else
{
return 0;
}
}

}
}

二,主界面程序 主要程序
namespace CommPort
{
public class Form1 : System.Windows.Forms.Form
{
private Class1 cl1 = new Class1();

public Form1()
{
InitializeComponent();
}


/// <summary>
/// 应用程序的主入口点。
/// </summary>

static void Main()
{
Application.Run(new Form1());
}

private void button1_Click(object sender, System.EventArgs e)
{
try
{
cl1.OpenPort("COM2:",115200,0,8,1);
MessageBox.Show("open");
}
catch
{
MessageBox.Show("error");
}
}

private void button2_Click(object sender, System.EventArgs e)
{
byte [] byread = new byte [100];
port.Read(ref byread,100);
}

private void button3_Click(object sender, System.EventArgs e)
{
string ss = "中国电子器件\n";
wdata = System.Text.Encoding.Default.GetBytes(ss);
cl1.WritePort(wdata, wdata.Length);
}
}
}

麻烦大家帮忙
...全文
817 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
tinghai88 2010-10-18
  • 打赏
  • 举报
回复
大哥你这个是怎么写的呢,发个代码给我看看吧!yxfreeman@163.com
zhybbs 2010-03-27
  • 打赏
  • 举报
回复
因为运行程序的硬件厂家只提供支持VS2003的库,要做控制只能2003;
现在问题解决了,多谢大家
兔子-顾问 2010-03-27
  • 打赏
  • 举报
回复
为什么只能用2003阿。系统默认的之装了.net 1.1么?你可以安装2.0 net cf阿。
用api的,你看看c++的就可以了
1.createfile
2.settimeout,setdcb
3.createthread->listenThread

然后在listenThread里,缓存分析数据,通知界面。
zhybbs 2010-03-27
  • 打赏
  • 举报
回复
^_^,我只能用VS2003开发,真的不知道怎么调serialport
鲁虾 2010-03-27
  • 打赏
  • 举报
回复
累噢,去看看微软的类,不然会累死的!!
兔子-顾问 2010-03-27
  • 打赏
  • 举报
回复
-_-"

显然可以
不行的是你不是serialport。
不行的可能:
1.硬件驱动有问题
2.硬件有问题
3.控件使用错误/api使用错误
4.监听线程中出现错误,导致异常,如果api方法,可能没有Exception,但是无数据,如果serialport则会异常,可能被你try , catch了。
光这么猜很累。你弄好,发到我邮箱wuyazhe@yeah.net,有空的时候我给你看看。
zhybbs 2010-03-27
  • 打赏
  • 举报
回复
SerialPort类在wince下调不出来
zhybbs 2010-03-27
  • 打赏
  • 举报
回复
最好有代码,因为本人对软件概念比较差
兔子-顾问 2010-03-27
  • 打赏
  • 举报
回复
用微软的SerialPort类就可以了。

110,538

社区成员

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

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

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