读写串口

always 2000-03-21 08:44:00
我需要一个一个字节的读写串口,请诸位大侠指教。最好有例子。
...全文
849 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
lbbb 2000-03-22
  • 打赏
  • 举报
回复
static BOOL fComInit = FALSE;
static HANDLE hCom = NULL;

if (!hCom)
{
hCom = CreateFile ("COM1",
GENERIC_WRITE * GENERIC_READ, //此处的*要换成单竖线(Shift + \),放上后发不出!A Bug :))
0,
NULL,
OPEN_EXISTING,
0,
NULL); //创建串口的句柄
if (INVALID_HANDLE_VALUE == hCom)
{
hCom = NULL;
}
else
{
DCB dcb;
GetCommState (hCom, &dcb); //得到通讯状态
dcb.BaudRate = 9600; //速率
dcb.ByteSize = 8; //字节
dcb.Parity = NOPARITY; //奇偶效验
dcb.StopBits = ONESTOPBIT; //停止位
SetCommState (hCom, &dcb); //设置通讯状态
if (!fComInit)
{
DWORD dwBytes;
for (int i=0; i<55; i++)
{
WriteFile (hCom, "\r\n", 2, &dwBytes, NULL); //发送
}
fComInit = TRUE;
}
}
}



CloseHandle (hCom); //关闭
hCom = NULL;

读串口用ReadFile()
其他设置可以看MSDN
lbbb 2000-03-22
  • 打赏
  • 举报
回复
我已经E_mail给你啦!
首先创建:hCom = CreateFile(“COM1”,
GENERIC_WRITE GENERIC_READ,
0,
NULL,
OPEN_EXISTING,
0,
NULL);
然后建立通讯环境:
DCB dcb;
GetCommState (hCom, &dcb);
dcb.BaudRate = 9600; //速率
dcb.ByteSize = 8; //字节
dcb.Parity = NOPARITY; //奇偶效验
dcb.StopBits = ONESTOPBIT; //停止位
SetCommState (hCom, &dcb);
还可以设置时间:
SetCommTimeout
发数据:
WriteFile
读数据: ReadFile
关闭: CloseHandle


打倒网管,发不出原程序!
lbbb 2000-03-22
  • 打赏
  • 举报
回复
例子程式放不上去,请查看email.
dengdeng 2000-03-22
  • 打赏
  • 举报
回复
PCOMM开发包是一个DLL。名字叫PCOMM.DLL。
大小有56K。
JeffHe 2000-03-22
  • 打赏
  • 举报
回复
我也想得到帮助.
telan 2000-03-21
  • 打赏
  • 举报
回复
也可以去www.codeguru.com找串口读写类,更简单.
Badwood 2000-03-21
  • 打赏
  • 举报
回复
如果只在9X下使用,可以使用微软的mscom控件.
接管控件的OnComm事件.如下:
void CVCComDlg::OnOnCommMscomm1()
{
COleVariant varData;
int nCount,i;
char tc;
char szBuff[20];
UpdateData(true);
switch(m_Com.GetCommEvent()){
case 2://comEvRecieve
nCount=m_Com.GetInBufferCount();
varData=m_Com.GetInput();
for(i=0;i<nCount;i++){
tc=((char*)varData.parray->pvData)[i];
switch(m_TranType){
case 0://Character Mode
szBuff[0]=tc;
szBuff[1]=0;
break;
default://Binary Mode
sprintf(szBuff,"%2.2x",tc);
if(strlen(szBuff)>2){
szBuff[0]=szBuff[strlen(szBuff)-2];
szBuff[1]=szBuff[strlen(szBuff)-1];
szBuff[2]=0;
}
break;
}
m_Recv+=szBuff;
}
UpdateData(false);
break;
case 1://comEvSend
m_Sent=m_Data;
m_Data="";
UpdateData(false);
break;
}
}

void CVCComDlg::OnButtonSend()
{
UpdateData(true);
if(!m_Com.GetPortOpen()){
AfxMessageBox("请先打开串口");
return;
}
if(m_Data.GetLength()==0)
return;
COleVariant varData;
CByteArray buff;
int i;
bool bEndDo;
char szBuff[5];
char cData;
switch(m_TranType){
case 0:
varData=m_Data;
m_Com.SetOutput(varData);
break;
default:
i=0;
bEndDo=false;
buff.SetSize(1);
do{
if(i>=m_Data.GetLength()){
bEndDo=true;
continue;
}
szBuff[0]=m_Data.GetAt(i++);
if(i>=m_Data.GetLength())
szBuff[1]=0;
else
szBuff[1]=m_Data.GetAt(i++);
szBuff[2]=0;
if(sscanf(szBuff,"%x",&cData)==0)
continue;
buff.SetAt(0,cData);
varData=buff;
m_Com.SetOutput(varData);
}while(!bEndDo);
break;
}
}
Sniper 2000-03-21
  • 打赏
  • 举报
回复
推荐《Window95通信编程》,清华大学出版社,[美]Charles A.Mirho & Andre Terrisse著。
archvile 2000-03-21
  • 打赏
  • 举报
回复
VC5和VC6中都有一个例子,叫TTY.

Visual Studio 6 MSDN的例子在Visual C++ documentation/Samples/SDK Samples/Winbase Samples/IO Samples/Serial Sample里面。
dengdeng 2000-03-21
  • 打赏
  • 举报
回复
台湾的MOXA公司推出了一套开发包叫PCOMM。
核心是一个DLL。提供了(win9x, winnt)下对串口的读写操作,
还有一系列回调函数。非常好用。

如果需要通知我: carderlee@netease.com

16,466

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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