串口通讯问题。急!急!!!!(100分)

  • 主题发起人 主题发起人 achane
  • 开始时间 开始时间
A

achane

Unregistered / Unconfirmed
GUEST, unregistred user!
我用Dephi写了一个PC和单片机通讯的程序。PC发,单片机收。
现在问题是:
1、如果一次发一串的话,单片机接受错误,或收不完整。如果一次发一个字符,则正确。
2、WriteFile只能在WIN98下调试通过,在WIN2000里通不过。是否是某些参数设置不对?
 
1、单片机接收较慢,不能一次发太多;
2、W2K是NT的内核,NT是不轻易允许写硬件端口的。

解决办法:
1、一次发几个字节或你说的一个字符;
2、不在W2K下用它,万一要用,请到深度历险找个能NT下读写的控件,
或分析别人是怎么写的(我没有NT下做过写端口的事,便我知道要让杨
声器在NT下通过写端口(一定是端口的方法)发不同频率声是不简单的,
98下则随心所欲)
 
谢谢你的帮助,只是我还未能接受.
我发的数据量比较大,所以一次发一个行不通.一次发几个单片机还是收不对.
我不想用控件,只想用API在W2K下做,因为即使现在在W98下通了,以后移到W2K下还是不行.
 
我写的怎么没问题,把代码贴出来看看。

 
如果是对串口进行读写,
很多控件在nt下都可用,
说起那些控件,归根到底还是调用win32api,
好想就是CreateFile那个,只不过是把串口也当作一个文件,
不知你使用的什么方法?(直接读写肯定不行,在nt下)
这种控件在98,nt下应该可以通用(我只在win2000下试过)。
 
以下是我初始串口的程序:
function TForm1.Init_RS232(com_name:pChar):boolean; //初始化RS232
var
lpdcb:TDCB;
begin
hCom:=CreateFile(com_name,generic_read or
generic_write,0,nil,open_existing,
file_flag_overlapped,0);//打开串行口
if hCom=invalid_handle_value then
begin
ShowMessage('Can not Open COM!');
CloseHandle(hCom);
Result:=false;
exit;
end;
successflag:=SetupComm(hCom,1024,1024); //设置COM输入,输出缓冲区皆为4096字节
if not successflag then
begin
ShowMessage('Can not setup COM!');
CloseHandle(hCom);
Result:=false;
exit;
end;
successflag:=GetCommState(hCom,lpdcb); //获取DCB当前默认设置
if not successflag then
begin
ShowMessage('Can not get DCB!');
CloseHandle(hCom);
Result:=false;
exit;
end;
lpdcb.baudrate:=9600;
lpdcb.ByteSize:=8;
lpdcb.Parity:=NoParity; //偶校验
lpdcb.StopBits:=OneStopBit;

successflag:=SetCommState(hCom,lpdcb);
if not successflag then
begin
ShowMessage('Can not setup DCB!');
CloseHandle(hCom);
Result:=false;
exit;
end;
successflag:=SetCommMask(hCom,ev_rxchar and ev_txempty); //指定串行口事件为接收到字符;
if not successflag then
begin
ShowMessage('Can not setup Event!');
CloseHandle(hCom);
Result:=false;
exit;
end;
PurgeComm(hCom,PURGE_RXCLEAR or PURGE_TXCLEAR);
Result:=true;
end;
下面是写串口的程序:
successflag:=WriteFile(hCom,outbuffer,Length(outbuffer),nBytesWrite,lpol);
在W98下successflag为True,而在W2K下却为False;
是不是在W2K下初始串口和W98有区别?
 
请到<a href=http://avsuper.126.com>http://avsuper.126.com</a>下载MyComm,
在98/NT/2000下都可以正常工作,程序带例子,极其简单.
 
1,单片机程序错误的面大(响应不及时、中断溢出、判断……)
2,nt确实不能用writefile写串口,文档里明白写着
 
iie:
nt不能用writefile,那我写的程序岂不是不能再2000下运行了?
但实际上我的可以啊。

 
不是不能用writefile,而是不能用它操作串口,您看看文档就明白了
 
可能是通讯协议没有对上(停止位数目不对,奇偶校验附加位不对等),WRITEFILE在
WIN2000下可以使用,只是汇编不能用了;
 
brightangel:
你看我的上面的程序在WIN2K里为什么不通?和你的有什么不同的地方吗?
能把你在WIN2K里的关于初始化串口和写串口的那部分程序给我看看吗?
 
发一串不能正确接受我想问题是不是在单片机上面,可能同步不对,或者单片
机的波特率没计算好。
我以前自己用API封装的端口在WINNT 4。0上用的很好,如果你要的话,我可以
把代码给你,不过是用C++ BUILDER 写的,不过你写的大致也不应该有错,我用
的就是WRITEFILE啊
 
我也用过writefile,会有一些小问题,但也可以用
1。应在2000下编译
2。初始化串口要仔细,参数都要自己设置。
我用过C++Builder作过,运行很好,
对了,也遇到过写失败的情况,重新make就好了
 
achane:
我用的是BCB,不知你是否需要我的代码,如果要,我再贴出来。
而且我用的方法是每次发一个字符,不过我想问题的关键不在这里。
看了你的代码,有些地方存在疑惑,但由于我对DELPHI不熟,可能说得不对
1、lpdcb.Parity:=NoParity; //偶校验
语句的意思是无校验,而你的注释却是偶校验
2、successflag:=SetCommMask(hCom,ev_rxchar and ev_txempty);
设置事件掩码好象应该用或(or)
3、successflag:=WriteFile(hCom,outbuffer, Length(outbuffer), nBytesWrite,lpol); 在W98下successflag为True,而在W2K下却为False;
由于你用重叠方式写串口,返回FALSE不一定是失败,有可能
是串口操作以重叠方式在后台进行。请用GetLastError()确定出错原因,
如果错误是ERROR_IO_PENDING表示重叠操作正在进行,应等待。
 
brightangel:
有些注释是我写错了。应该是无校验。我想看看你的C++BUILDER程序,请给我一份。
 
在波特率匹配的情况下,单片机采用中断方式接受应该没有什么问题
 
Novar:
我觉得这与单片机接受方式关系不大,事实在单片机上我就是用中断接受的.
 
lvxq:
我想想看看你的C++BUILDER程序,请发给我一份,谢谢!
 
我想是这样的:
1/你用的是BCD码(4BYTES)两个字一起送过来的时候,比如一个是0令一个是D,那么这两个邻近
的字符就被看成是一个转意符了,所以我想如果你用BCD码,那么最好不要用.
2/另外你用MS的MSComm控件或许可以大大的减少你的编程工作,很爽.VB里都有.
 
后退
顶部