寻求串口通讯代码

huyi25 2004-08-11 03:36:22
用SPCOmm实现对串口发送数据、读取数据的一个简单例程,最好要有多线程实现。
给出原代码者高分相送!(全给都行)!同时想认识做串口的朋友,大家共勉!
QQ:43635882
E-mail:huyi25@21cn.com
...全文
235 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
mmxcpu 2005-03-03
  • 打赏
  • 举报
回复
suuare(督察) 信誉:96 <>1000
??????????????????????????????????
suuare 2004-08-13
  • 打赏
  • 举报
回复
大家注意了 这个楼主提的问题从来就不结贴 以下是他曾经发过至今未结的帖子 这样的家伙有问题就让他憋着吧!
http://community.csdn.net/Expert/topic/3247/3247907.xml?temp=.3752863
http://community.csdn.net/Expert/topic/3223/3223622.xml?temp=.6042902
http://community.csdn.net/Expert/topic/3134/3134468.xml?temp=.5532648
http://community.csdn.net/Expert/topic/3123/3123147.xml?temp=.5250055
http://community.csdn.net/Expert/topic/3082/3082779.xml?temp=9.208316E-02
这位楼主,别人的一点心得告知于你,希望你能尊重别人的劳动成果!
princesd 2004-08-12
  • 打赏
  • 举报
回复
看看吧,好了就给分哦,等着用呢
princesd 2004-08-12
  • 打赏
  • 举报
回复
主程序:(我直接用的API写的哈,这样更灵活哦)




private
{ Private declarations }
ReadThread:TReadThread;//声明读取数据的线程
end;

var
Form1: TForm1;
hComm: THandle;

implementation

{$R *.DFM}

procedure TForm1.btnSendClick(Sender: TObject);
var
Temp:string;
lrc:LongWord;
begin
if (hComm=0) then exit;//若尚未打开通信端口,则跳出
Temp:=mSend.Text ;//欲送出的数据
//执行送出的函数
WriteFile(hComm,Pointer(Temp)^,Length(Temp), lrc, nil); //送出数据
end;

//以下是清除显示数据按钮按下时的执行程序代码
procedure TForm1.btnClearClick(Sender: TObject);
begin
mReceive.Clear; //将接收区清除
end;

//以下是打开通信端口的函数
procedure TForm1.btnOpenPortClick(Sender: TObject);
begin

end;
//结束系统的按钮
procedure TForm1.btnEndClick(Sender: TObject);
begin
CloseHandle(hComm);//关闭通信端口
end;


//当于Memo对象中按下按钮后,执行以下的程序
//窗体建立时执行以下的程序
procedure TForm1.FormCreate(Sender: TObject);
begin
//建立线程对象,并且激活执行
ReadThread:=TReadThread.Create(False);
end;

//窗体关闭时执行以下的程序
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
ReadThread.Free; //释放对象
end;


procedure TForm1.btnOKClick(Sender: TObject);
var
cc:TCOMMCONFIG;
Temp:string;
begin
Temp:=trim(Combobox1.Text) ; // 选择所要打开的COM
hComm:=CreateFile(PChar(Temp), GENERIC_READ or GENERIC_WRITE,
0, nil, OPEN_EXISTING, 0, 0);// 打开COM
if (hComm = INVALID_HANDLE_VALUE) then
begin//如果COM 未打开
MessageBox (0, '打开通信端口错误!!','',MB_OK);
exit;
end;

GetCommState(hComm,cc.dcb); // 得知目前COM 的状态
cc.dcb.BaudRate:=CBR_9600; // 设置波特率为9600
cc.dcb.ByteSize:=8; //字节为 8 bit
cc.dcb.Parity:=NOPARITY; // Parity 为 None
cc.dcb.StopBits:=ONESTOPBIT;// 1 个Stop bit

if not SetCommState(hComm, cc.dcb) then
begin// 设置COM 的状态
MessageBox (0, '通信端口设置错误!!!','',MB_OK);
CloseHandle(hComm);//关闭通信端口
exit;
end;



end;

procedure TForm1.Button6Click(Sender: TObject);
var
Temp:string;
lrc:LongWord;
begin
if (hComm=0) then exit;//若尚未打开通信端口,则跳出
Temp:=mSend.Lines.Text ;//欲送出的数据
//执行送出的函数
WriteFile(hComm,Pointer(Temp)^,Length(Temp), lrc, nil); //送出数据
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
if OpenDialog1.Execute then
begin
mSend.Lines.LoadFromFile(OpenDialog1.FileName);
end;

end;

procedure TForm1.BitBtn1Click(Sender: TObject);
begin
close
end;

procedure TForm1.FormShow(Sender: TObject);
begin
btnOKClick(Sender);
btnok.Enabled:=false;
end;

procedure TForm1.ComboBox1Change(Sender: TObject);
begin
CloseHandle(hComm);//关闭通信端口
btnok.Enabled:=true;
end;

procedure TForm1.ComboBox2Change(Sender: TObject);
begin
CloseHandle(hComm);//关闭通信端口
btnok.Enabled:=true;
end;

end.
princesd 2004-08-12
  • 打赏
  • 举报
回复
我给你一个吧:
线程文件:unit Unit2;

interface

uses
Windows,Classes, SysUtils;

type
TReadThread = class(TThread)
private
{ Private declarations }
procedure ReadPort; //读取串行端口数据
protected
procedure Execute; override;
end;

implementation
uses Unit1; // 声明引用Unit1,必须放在implementation区段

procedure TReadThread.Execute;
begin
{ Place thread code here }
While not Terminated do
begin
Synchronize(ReadPort);//刚才所定义的读取数据函数
end;
end;

//读取串行端口的程序放在这里
procedure TReadThread.ReadPort;
var
Temp : string;
inbuff: array[0..65534] of Char;
nBytesRead, dwEvent, dwError:LongWORD ;
cs:TCOMSTAT;
begin
if (hComm=0) then exit;//先判断是否已打开通信端口
ClearCommError(hComm,dwError,@CS); //取得状态
ReadFile(hComm, inbuff,cs.cbInQue,nBytesRead,nil); // 接收COM 的数据
//串行在读取数据后,会自动将缓冲区中已被读取的数据清除掉
if cs.cbInQue =0 then exit;
// 数据是否大于我们所准备的Buffer
if cs.cbInQue > sizeof(inbuff) then
begin
PurgeComm(hComm, PURGE_RXCLEAR); // 清除COM 数据
exit;
end;
Temp:=Copy(inbuff,1,cs.cbInQue);//取出数据
Form1.mReceive.Text :=Form1.mReceive.Text + Temp; // 将数据显示于Memo1 上
Form1.mReceive.SetFocus ;
Form1.mReceive.SelStart :=Length(Form1.mReceive.Text);
Form1.mReceive.SelLength :=0; //移到最下端
end;


end.

kaguo 2004-08-12
  • 打赏
  • 举报
回复
建议使用VssComm
huyi25 2004-08-12
  • 打赏
  • 举报
回复
ljmanage(过客)
昨天你发了吗?怎么我没有收到,劳烦你发个给我,小弟感激不尽!同时能留个QQ号吗?想和你交流一下!
李_军 2004-08-11
  • 打赏
  • 举报
回复
晚上给你发一个,用SPCOMM做的,通过USB口转换成串口后不行,建议直接用API编,例子我也有

1,183

社区成员

发帖
与我相关
我的任务
社区描述
Delphi Windows SDK/API
社区管理员
  • Windows SDK/API社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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