从串口中取数据,该怎么写

small2j 2006-10-26 11:04:18
现在有一个嵌入式设备,与电脑的串口相连,设备往端口写数据,那么怎么样实现从电脑端这里读到数据,保存在一个文件里.

有哪位能给源代码
写这程序要注意什么问题,以前没写过通信类的程序,刚学C++ Builder,找不到好的书学.

小弟先谢了!

...全文
322 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
jiangshx 2006-10-28
  • 打赏
  • 举报
回复
用第三方串口通讯控件 PComm
small2j 2006-10-28
  • 打赏
  • 举报
回复
再次感谢了,我试试看.
Andrionda 2006-10-27
  • 打赏
  • 举报
回复
我没想到 格式是那样的
楼主自己整理一下吧 !
Andrionda 2006-10-27
  • 打赏
  • 举报
回复
太慢了.

BCB写的一个简单串口通信类- -
Tag: BCB写的一个简单串口通信类

////---------------------------------------------------------------------------#include <Classes.hpp>#include "ReceiveThread.h"#ifndef SerialH#define SerialH
//---------------------------------------------------------------------------class Serial{protected: DCB dcb; bool Opend; OVERLAPPED OverWrite; hReceiveThread *ReceiveCom;public: bool IsOpen(void); bool OpenSerial(AnsiString Com,DWORD Baud,DWORD Fparity,BYTE ByteSize,BYTE StopBit); bool SentString(AnsiString str); bool SentData(unsigned char *Buff,int ByteToWritten); bool CloseSerial(void);
Serial(void); ~Serial(void);};
#endif
//---------------------------------------------------------------------------#pragma hdrstop#include "Serial.h"
//---------------------------------------------------------------------------#pragma package(smart_init)
HANDLE hCom; //串行设备句柄//---------------------------------------------------------------------------Serial::Serial(void){ Opend = false; hCom = NULL;}//---------------------------------------------------------------------------Serial::~Serial(void){}//---------------------------------------------------------------------------bool Serial::IsOpen(void) //串口打开标志{ return Opend;}
//---------------------------------------------------------------------------bool Serial::OpenSerial(AnsiString Com,DWORD Baud,DWORD Fparity,BYTE ByteSize,BYTE StopBit){ if(Opend == true) { MessageBox(0,"Port Is Already Opened!","Warning",MB_ICONWARNING); return false; } hCom=CreateFile(Com.c_str(), GENERIC_READ|GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, NULL); if(hCom==INVALID_HANDLE_VALUE) { MessageBox(0,"Can not open the serial port!","Error",MB_ICONERROR); CloseHandle(hCom); hCom=NULL; Opend = false; return false; } if(!SetCommMask(hCom,EV_RXCHAR)) { MessageBox(0,"SetCommMask failed!","Error",MB_ICONERROR); Opend = false; return false; } if(!SetupComm(hCom,1024,1024)) { MessageBox(0,"SetupComm failed!","Error",MB_ICONERROR); Opend = false; return false; } PurgeComm(hCom,PURGE_TXABORT|PURGE_RXABORT|PURGE_TXCLEAR|PURGE_RXCLEAR);
GetCommState(hCom,&dcb); dcb.BaudRate = Baud; //设定波特率 dcb.fParity = Fparity; //设定奇偶校验 dcb.ByteSize = ByteSize; //设定数据位 dcb.StopBits = StopBit; //设定停止位
dcb.Parity=0; // 0-4=no,odd,even,mark,space dcb.fNull=false; // 1,enable null stripping SetCommState(hCom,&dcb);
ReceiveCom=new hReceiveThread(false); ReceiveCom->FreeOnTerminate=true;
Opend=true; return true;}
//---------------------------------------------------------------------------bool Serial::SentString(AnsiString str){ if(WriteFile(hCom,str.c_str(),str.Length(),NULL,&OverWrite)) return true; else return false;}//---------------------------------------------------------------------------bool Serial::SentData(unsigned char *Buff,int ByteToWritten){ if(WriteFile(hCom,Buff,ByteToWritten,NULL,&OverWrite)) return true; else return false;}//---------------------------------------------------------------------------bool Serial::CloseSerial(void){ if(Opend==true) { if(CloseHandle(hCom)) ReceiveCom->Terminate(); else return false; }
hCom=NULL; Opend = false; return true;}//---------------------------------------------------------------------------
//---------------------------------------------------------------------------#include <Classes.hpp>#include <queue>#include <List.h>#ifndef ReceiveThreadH#define ReceiveThreadH
//---------------------------------------------------------------------------class hReceiveThread : public TThread{protected: COMSTAT ComStat; OVERLAPPED os; OVERLAPPED OverRead; DWORD dwEvtMask; queue<unsigned char> RXBuffer; //接收缓冲区 void __fastcall UserAdd(void); void __fastcall Execute(void);public: __fastcall hReceiveThread(bool CreateSuspended);};#endif
//---------------------------------------------------------------------------#include <vcl.h>
#pragma hdrstop#include "ReceiveThread.h"#include "Serial.h"
//---------------------------------------------------------------------------#pragma package(smart_init)
extern HANDLE hCom; //串行设备句柄
__fastcall hReceiveThread::hReceiveThread(bool CreateSuspended): TThread(CreateSuspended){}//---------------------------------------------------------------------------void __fastcall hReceiveThread::Execute(void){ memset(&OverRead,0,sizeof(OVERLAPPED)); OverRead.hEvent=CreateEvent(NULL,true,true,NULL);
if (OverRead.hEvent==NULL) Terminate(); if (!SetCommMask(hCom,EV_RXCHAR|EV_TXEMPTY)) Terminate();
while (!Terminated) { WaitForSingleObject(OverRead.hEvent,INFINITE);
bool WaitComEv; bool ReadStat; DWORD dwError; DWORD ByteRead; unsigned char RXBuff;
WaitComEv=WaitCommEvent(hCom,&dwEvtMask,&OverRead); if(WaitComEv) ClearCommError(hCom,&dwError,&ComStat);
if(!WaitComEv && GetLastError()==ERROR_IO_PENDING) { ClearCommError(hCom,&dwError,&ComStat); while (ComStat.cbInQue>0 && dwEvtMask==EV_RXCHAR) { ReadStat = ReadFile(hCom,&RXBuff,1,&ByteRead,&os);
if(!ReadStat && GetLastError()==ERROR_IO_PENDING) { while(!GetOverlappedResult(hCom,&os,&ByteRead,true)) { dwError=GetLastError(); if(dwError==ERROR_IO_INCOMPLETE) continue; else break; } }
if(ReadStat) { RXBuffer.push(RXBuff); ClearCommError(hCom,&dwError,&ComStat); Synchronize(UserAdd); } } } }}//---------------------------------------------------------------------------void __fastcall hReceiveThread::UserAdd(void){ //add you code here}
i_love_pc 2006-10-26
  • 打赏
  • 举报
回复
大斑竹网站上有一本书《C++Builder与RS-232串行通信控制》
http://www.ccrun.com/view.asp?id=244

下载来看一看。
Estfania 2006-10-26
  • 打赏
  • 举报
回复
首先应该先定义个编码格式,类似于网络程序设计(即输入规范);
然后使用Device I/O,可以使用CreateFile创建监听端口,使用ReadFile读取串口内容;
详情可以参见MSDN的Communications Resources

1,317

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder 网络及通讯开发
社区管理员
  • 网络及通讯开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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