readfile 有兩種讀取模式, 一種是阻塞型的, 實現比較簡單, 但要做到線程中;
一種是非阻塞的;我估計你是使用了 阻塞的通信方式
一種是非阻塞的;我估計你是使用了 阻塞的通信方式
解决方案 »
- 初学者新编的C#计算器代码,另外KeyPress事件想不到该怎么简单的实现,求助...
- 请教自己做个网站
- 新手提问:自定义控件怎样随主窗口最大化而变化
- 关于Winform 自动开机自动登录问题 (急救)
- load (加载)事件
- 机器码生成思路
- md5 加密,错误信息用红字标出,请高手指导一下,怎么改!
- 一个nunit的简单问题
- 新手问题,update()只能更新DataSet无法更新数据库
- 我已把sa的密码改为sa,为和在登陆时仍然提示我因为没有与sql server 建立信任连接而不允许登陆?如何解决?
- 我在WevServices服务端使用了vjslib.dll这个.NET自带的动态库,可是把这个服务端部署到另一台机器却说没有找到,我搜索过是有的!!!
- 一个字符串包含另一个字符串的方法?
{
byte[] BufBytes;
byte[] OutBytes;
BufBytes = new byte[NumBytes];
if (hComm!=INVALID_HANDLE_VALUE)
{
OVERLAPPED ovlCommPort = new OVERLAPPED();
int BytesRead=0;
ReadFile(hComm,BufBytes,NumBytes,ref BytesRead,ref ovlCommPort);
OutBytes = new byte[BytesRead];
Array.Copy(BufBytes,OutBytes,BytesRead);
}
else
{
throw(new ApplicationException("串口未打开!")); }
return OutBytes;
}就是这段代码!
怎么区分阻塞与非阻塞呢?
如果是阻塞的话当我运行串口精灵程序以后怎么再用这段代码没有问题呢?
->
ReadFile(hComm,ref BufBytes,NumBytes,ref BytesRead,ref ovlCommPort);试试
还是不行啊!运行到readfile就停住了,这是咋回事呢?
{
DCB dcbCommPort = new DCB();
COMMTIMEOUTS ctoCommPort = new COMMTIMEOUTS();
// 打开串口 OPEN THE COMM PORT.
hComm = CreateFile(PortNum ,GENERIC_READ | GENERIC_WRITE,0, 0,OPEN_EXISTING,0,0);
// 如果串口没有打开,就打开 IF THE PORT CANNOT BE OPENED, BAIL OUT.
if(hComm == INVALID_HANDLE_VALUE)
{
throw(new ApplicationException("非法操作,不能打开串口!"));
}
// 设置通信超时时间 SET THE COMM TIMEOUTS.
GetCommTimeouts(hComm,ref ctoCommPort);
ctoCommPort.ReadTotalTimeoutConstant = ReadTimeout;
ctoCommPort.ReadTotalTimeoutMultiplier = 0;
ctoCommPort.WriteTotalTimeoutMultiplier = 0;
ctoCommPort.WriteTotalTimeoutConstant = 0;
SetCommTimeouts(hComm,ref ctoCommPort);
// 设置串口 SET BAUD RATE, PARITY, WORD SIZE, AND STOP BITS.
GetCommState(hComm, ref dcbCommPort);
dcbCommPort.BaudRate=BaudRate;
dcbCommPort.flags=0;
//dcb.fBinary=1;
dcbCommPort.flags|=1;
if (Parity>0)
{
//dcb.fParity=1
dcbCommPort.flags|=2;
}
dcbCommPort.Parity=Parity;
dcbCommPort.ByteSize=ByteSize;
dcbCommPort.StopBits=StopBits;
if (!SetCommState(hComm, ref dcbCommPort))
{
//uint ErrorNum=GetLastError();
throw(new ApplicationException("非法操作,不能打开串口!"));
}
//unre to see if setting took correctly
//DCB dcbCommPort2 = new DCB();
//GetCommState(hComm, ref dcbCommPort2);
Opened = true;
return CClassConst.MM_COMMUNICATION_SUCESS;
}俺是这样定义的
hComm = CreateFile(PortNum ,GENERIC_READ | GENERIC_WRITE,0, 0,OPEN_EXISTING,0,0);
->
hComm = CreateFile(PortNum ,GENERIC_READ | GENERIC_WRITE,FILE_SHARE_WRITE, 0,OPEN_EXISTING,0,0);
->
hComm = CreateFile(PortNum ,GENERIC_READ | GENERIC_WRITE,FILE_SHARE_READ|FILE_SHARE_WRITE, 0,OPEN_EXISTING,0,0);
奇怪的是,就算是用阻塞方式的话,当我用WizPort.exe这样的串口程序运行以后再使用这段代码就没有问题呢?
真是奇怪!奇怪!
运行WizPort.exe后,creatfile返回值为0x9b4这有什么关系吗?