win2000pro下的串口程序(100分)

  • 主题发起人 主题发起人 nywjx
  • 开始时间 开始时间
N

nywjx

Unregistered / Unconfirmed
GUEST, unregistred user!
我公司的一个串口程序,主要是pc和前端控制器间的通信,前端刷卡后在pc上有显示;
实时读取前端控制器的时间;在win98下运行正常,可是在win2000pro下,程序刚运行
的时候,从串口读不到前端控制器的时间,刷卡几次后才有刷卡显示并且读到了前端
控制器的时间,但是多刷几次后,就什么反应也没有了。
程序中是使用createfile来实现串口通信的。
我想问一下各位:win2000pro下是否要设置什么才能解决这个问题?还是程序中要设置?
 
你做的程序有没有串口监视的功能,如果有的话,你看看串口数据是不是正确,
如果不正确,和正确的数据有什么差别,好分析原因,
如果没有监视功能,就加一个吧,也不麻烦的。
 
哦,我不知道,不是我做的。是以前别人做的。
我觉得应该不是数据不正确,因为有数据过来啊。
我觉得应该是编译的时候一些参数要设置吧,呵呵。我也不清楚,只是猜测而已。
哦,对了,这个程序是用C++Builder做的。
 
嗨,朋友,帮我看看这个问题吧
http://www.delphibbs.com/delphibbs/dispq.asp?LID=1154487
 
快呀,各位大侠,帮帮我啊!
解决后可以加分!
 
还没人能回答啊?高手都看球去了吗?
呜呜。。。。我要失业了,求求各位了。
 
我觉得你还是应该看看数据,你说应该不是数据不正确,
其实这和没说差不多,你还是没有肯定数据是否正确。
你看了数据之后,如果数据正确,那是数据处理的问题,
如果数据不正确,那是串口的设置有问题。
确定那里有问题才好解决。
 
这是我的程序,请高手帮我看看:

void __fastcall COMM::Execute()
{
DWORD ERRORS, Counts;
COMSTAT commstat;

do
{
if(WaitCommEvent(hCom, &dwEvtMask, NULL) == TRUE)
{
if (dwEvtMask & EV_RXCHAR)
{
if(ClearCommError(hCom, &ERRORS, &commstat) == TRUE)
{
BYTE * Buffer = new BYTE [commstat.cbInQue];
if(ReadFile(hCom, Buffer, commstat.cbInQue, &Counts, NULL) == TRUE)
{
PostThreadMessage(commThread, WM_RXChar, Counts, (LPARAM)Buffer);
}
}
}
}
} while(1);
}
//---------------------------------------------------------------------------
BOOL __fastcall COMM::WriteToComm(int Length, BYTE * Buffer)
{
DWORD Counts;
BYTE * buffer = new BYTE [Length+3];
buffer[0] = '/xff', buffer[1] = '/xaa', buffer[2] = Length;
memcpy(buffer+3, Buffer, Length);

BOOL Result = WriteFile(hCom, buffer, Length+3, &Counts, NULL);
return Result;
}
//---------------------------------------------------------------------------
Boolean __fastcall COMM::InitComm(char * portSel, int baudRate, int byteSize, int parity, int stopBits)
{
if(hCom) {
PurgeComm(hCom, PURGE_TXABORT|PURGE_RXABORT|PURGE_TXCLEAR|PURGE_RXCLEAR);
CloseHandle(hCom);
}

hCom = CreateFile(portSel,
GENERIC_READ | GENERIC_WRITE,
0, /* exclusive access */
NULL, /* no security attrs */
OPEN_EXISTING,
0,//FILE_FLAG_OVERLAPPED,
NULL
);

if (hCom == INVALID_HANDLE_VALUE){
MessageBox(NULL, "不能打开通信端口", "打开错误", MB_OK|MB_ICONERROR);
return False;
}

DCB dcb;
BOOL fSuccess;
int BaudRate[4] = { 9600, 4800, 2400, 1200 };

GetCommState(hCom, &dcb);

dcb.BaudRate = BaudRate[baudRate];
dcb.ByteSize = 4+byteSize;
dcb.Parity = parity;
dcb.StopBits = stopBits;

fSuccess = SetCommState(hCom, &dcb);
fSuccess = SetCommMask(hCom, EV_RXCHAR);
PurgeComm(hCom, PURGE_TXABORT|PURGE_RXABORT|PURGE_TXCLEAR|PURGE_RXCLEAR);

char Parity[3] = "NOE";
char StopBits[3][4] = { "1", "1.5", "2" };
fmMain->sbText->Panels->Items[1]->Text =
AnsiString(int(dcb.BaudRate))+'-'+AnsiString(int(dcb.ByteSize))+'-'
+Parity[parity]+'-'+StopBits[stopBits];
return True;
}
 
你看一下你的buffer有多大,要保证你的数据处理速度跟的上你串口接收的速度。
也就是你处理buffer的进程不能太忙,否则是要丢数据的。这些参数的大小就要靠实验来
确定了。试了有问题再来问我吧!
 
hzfgh:呵呵,你没看我的问题。
我的程序在win98下一点问题没有,win2000下就不行。
 
void __fastcall COMM::Execute()
{
DWORD ERRORS, Counts;
COMSTAT commstat;

do
{
if(WaitCommEvent(hCom, &dwEvtMask, NULL) == TRUE)//你的程序这里有问题
{
if (dwEvtMask & EV_RXCHAR)
{
if(ClearCommError(hCom, &ERRORS, &commstat) == TRUE)
{
BYTE * Buffer = new BYTE [commstat.cbInQue];
if(ReadFile(hCom, Buffer, commstat.cbInQue, &Counts, NULL) == TRUE)
{
PostThreadMessage(commThread, WM_RXChar, Counts, (LPARAM)Buffer);
}
}
}
}
} while(1);
}
WaitCommEvent(hCom, &dwEvtMask, NULL) 这个函数最后一个参数不能为空,这是一个安全
变量指针你查一下Windows的API函数就知道,window NT结构的操作系统安全变量指针为空的
情况函数返回是有错误的,window 9X由于安全性要求没有那么高所以没有这个问题。
当然,其它类似的函数你也要检查一下。正确的写法是WaitCommEvent(hcom[1],dwevtmask,@os)
os声明的类型:os:Toverlapped;
 
:hzfgh,
不行,我改了,还是没反应。
 
你改了多少地方,是所有的相关函数都改了吗?
所有的CreateFile,WriteFile,ReadFile等等全部要用这个安全变量指针的
 
不行的。我只改了你说的WaitCommEvent部分,但是编译就不通过。我用的是c++builder
 
多人接受答案了。
 
后退
顶部