当前位置:首页 » 编程语言 » vc60c语言串口
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

vc60c语言串口

发布时间: 2022-08-11 08:49:30

❶ VS或者VC6.0编写的C语言程序,怎样能够实现串口数据的收发

1 、Windows API通信函数方法 。与通信有关的Windows API函数共有26个,但主要有关的有: CreateFile() 用 “comn”(n为串口号)作为文件名就可以打开串口。 ReadFile() 读串口。

2、WriteFile() 写串口。 CloseHandle() 关闭串口句柄。初始化时应注意CreateFile()函数中串口共享方式应设为0,串口为不可共享设备,其它与一般文件读写类似。以下给出API实现的源代码。



3、利用端口函数直接操作 。这种方式主要是采用两个端口函数_inp(), _outp()实现对串口的读写,其中读端口函数的原型为: int _inp(unsigned shot port) 。该函数从端口读取一个字节,端口号为0~65535。 写端口的函数原型为: nt _outp(unsigned shot port, int databyte) 。

4、 MSComm控件 。MSComm控件是微软开发的专用通信控件,封装了串口的所有功能,使用很方便,但在实际应用中要小心对其属性进行配置。下面详细说明该类应用方法。



❷ vc6.0中,如何实现具有选择串口号的功能,代码如何编写

在对话框出列出所有串口;

选择串口得到相应的地址;

根据需要对地址进行操作。

//串口地址

intLCR,DLL,DLM,LSR,MCR,MSR,THR,RBR,IER,IIR;

//波特率

longBaudRate;

//校验方式

intParity;

voidCMycomView::OnAppPort()

{

//TODO:Addyourcommandhandlercodehere

comportcomportDlg;

comportDlg.DoModal();

com_port=comportDlg.com_port;

BaudRate=comportDlg.BaudRate;

Parity=comportDlg.Parity;

if(com_port==1)

{

LCR=0x3FB;

DLL=0x3F8;

DLM=0x3F9;

LSR=0x3FD;

MCR=0x3FC;

MSR=0x3FE;

THR=0x3F8;

RBR=0x3F8;

IER=0x3F9;

IIR=0x3FA;

}

if(com_port==2)

{

LCR=0x2FB;

DLL=0x2F8;

DLM=0x2F9;

LSR=0x2FD;

MCR=0x2FC;

MSR=0x2FE;

THR=0x2F8;

RBR=0x2F8;

IER=0x2F9;

IIR=0x2FA;

}

}

❸ VC++ 6.0串口编程 接收数据程序错误

我对比查看了龚建伟的串口编程例子接收数据部分,没有发现不对。你是用虚拟串口吗?

voidCSCommTestDlg::OnComm1()
{
//TODO:
VARIANTvariant_inp;
COleSafeArraysafearray_inp;
LONGlen,k;
BYTErxdata[2048];//设置BYTE数组An8-bitintegerthatisnotsigned.
CStringstrtemp;
if(m_ctrlComm.GetCommEvent()==2)//事件值为2表示接收缓冲区内有字符
{
variant_inp=m_ctrlComm.GetInput();//读缓冲区
safearray_inp=variant_inp;//VARIANT型变量转换为ColeSafeArray型变量
len=safearray_inp.GetOneDimSize();//得到有效数据长度
for(k=0;k<len;k++)
safearray_inp.GetElement(&k,rxdata+k);//转换为BYTE型数组

for(k=0;k<len;k++)//将数组转换为Cstring型变量
{
BYTEbt=*(char*)(rxdata+k);//字符型
if(m_ctrlHexDisplay.GetCheck())
strtemp.Format("%02X",bt);//将字符以十六进制方式送入临时变量strtemp存放,注意这里加入一个空隔
else
strtemp.Format("%c",bt);//将字符送入临时变量strtemp存放

m_strRXData+=strtemp;//加入接收编辑框对应字符串
}

}
UpdateData(FALSE);//更新编辑框内容
}

❹ vc++串口编程

例程1

打开VC++6.0,新建基于对话框的工程RS485Comm,在主对话框窗口IDD_RS485COMM_DIALOG上添加两个按钮,ID分别为IDC_SEND和IDC_RECEIVE,标题分别为“发送”和“接收”;添加一个静态文本框IDC_DISP,用于显示串口接收到的内容。

在RS485CommDlg.cpp文件中添加全局变量:

HANDLE hCom; //全局变量,串口句柄

在RS485CommDlg.cpp文件中的OnInitDialog()函数添加如下代码: // TODO: Add extra initialization here
hCom=CreateFile("COM1",//COM1口
GENERIC_READ|GENERIC_WRITE, //允许读和写
0, //独占方式
NULL,
OPEN_EXISTING, //打开而不是创建
0, //同步方式
NULL);
if(hCom==(HANDLE)-1)
{
AfxMessageBox("打开COM失败!");
return FALSE;
}

SetupComm(hCom,100,100); //输入缓冲区和输出缓冲区的大小都是1024

COMMTIMEOUTS TimeOuts;
//设定读超时
TimeOuts.ReadIntervalTimeout=MAXDWORD;
TimeOuts.ReadTotalTimeoutMultiplier=0;
TimeOuts.ReadTotalTimeoutConstant=0;
//在读一次输入缓冲区的内容后读操作就立即返回,
//而不管是否读入了要求的字符。

//设定写超时
TimeOuts.WriteTotalTimeoutMultiplier=100;
TimeOuts.WriteTotalTimeoutConstant=500;
SetCommTimeouts(hCom,&TimeOuts); //设置超时

DCB dcb;
GetCommState(hCom,&dcb);
dcb.BaudRate=9600; //波特率为9600
dcb.ByteSize=8; //每个字节有8位
dcb.Parity=NOPARITY; //无奇偶校验位
dcb.StopBits=TWOSTOPBITS; //两个停止位
SetCommState(hCom,&dcb);

PurgeComm(hCom,PURGE_TXCLEAR|PURGE_RXCLEAR);

分别双击IDC_SEND按钮和IDC_RECEIVE按钮,添加两个按钮的响应函数: void CRS485CommDlg::OnSend()
{
// TODO: Add your control notification handler code here
// 在此需要简单介绍百特公司XMA5000的通讯协议:
//该仪表RS485通讯采用主机广播方式通讯。
//串行半双工,帧11位,1个起始位(0),8个数据位,2个停止位(1)
//如:读仪表显示的瞬时值,主机发送:DC1 AAA BB ETX
//其中:DC1是标准ASCII码的一个控制符号,码值为11H(十进制的17)
//在XMA5000的通讯协议中,DC1表示读瞬时值
//AAA是从机地址码,也就是XMA5000显示仪表的通讯地址
//BB为通道号,读瞬时值时该值为01
//ETX也是标准ASCII码的一个控制符号,码值为03H
//在XMA5000的通讯协议中,ETX表示主机结束符

char lpOutBuffer[7];
memset(lpOutBuffer,''\0'',7); //前7个字节先清零
lpOutBuffer[0]=''\x11''; //发送缓冲区的第1个字节为DC1
lpOutBuffer[1]=''0''; //第2个字节为字符0(30H)
lpOutBuffer[2]=''0''; //第3个字节为字符0(30H)
lpOutBuffer[3]=''1''; // 第4个字节为字符1(31H)
lpOutBuffer[4]=''0''; //第5个字节为字符0(30H)
lpOutBuffer[5]=''1''; //第6个字节为字符1(31H)
lpOutBuffer[6]=''\x03''; //第7个字节为字符ETX
//从该段代码可以看出,仪表的通讯地址为001
DWORD dwBytesWrite=7;
COMSTAT ComStat;
DWORD dwErrorFlags;
BOOL bWriteStat;
ClearCommError(hCom,&dwErrorFlags,&ComStat);
bWriteStat=WriteFile(hCom,lpOutBuffer,dwBytesWrite,& dwBytesWrite,NULL);
if(!bWriteStat)
{
AfxMessageBox("写串口失败!");
}

}
void CRS485CommDlg::OnReceive()
{
// TODO: Add your control notification handler code here

char str[100];
memset(str,''\0'',100);
DWORD wCount=100;//读取的字节数
BOOL bReadStat;
bReadStat=ReadFile(hCom,str,wCount,&wCount,NULL);
if(!bReadStat)
AfxMessageBox("读串口失败!");
PurgeComm(hCom, PURGE_TXABORT|
PURGE_RXABORT|PURGE_TXCLEAR|PURGE_RXCLEAR);
m_disp=str;
UpdateData(FALSE);

}

您可以观察返回的字符串,其中有和仪表显示值相同的部分,您可以进行相应的字符串操作取出仪表的显示值。
打开ClassWizard,为静态文本框IDC_DISP添加CString类型变量m_disp,同时添加WM_CLOSE的相应函数: void CRS485CommDlg::OnClose()
{
// TODO: Add your message handler code here and/or call default
CloseHandle(hCom); //程序退出时关闭串口
CDialog::OnClose();
}

程序的相应部分已经在代码内部作了详细介绍。连接好硬件部分,编译运行程序,细心体会串口同步操作部分。

❺ 使用C/C++在VC6下编写简单串口通信程序

使用C/C++在VC6下编写简单串口通信程序
识主携梳促疤喜穴财碧乌围白店挨

你们本就是天生一对,地造一双,而今共偕连理,今后更需彼此宽容、互相照顾,祝福你们!

❻ 如何在vc6.0中为实现串口通信

首先创建一个VC6.0基于对话框的程序,然后在资源视图中,Project --- > Add To Project ---> compoents and controls...,如下图所示

在弹出的窗口选择“Registered ActiveX Controls”,双击进入该文件夹,如下图所示

在列表中找到“Microsoft Communications Control, version 6.0”,点击“Insert”按钮,如下图所示

接下来就会在资源视图中看到一个电话图标,如下图所示

右键该电话图标,选择“ClassWizard...”,如下图所示

在Member Variables下为该控件添加一个控件变量,如下图所示

在Message Maps下为该控件添加OnComm消息,如下图所示

在OnInitDialog()函数中,加入窗口控件初始化函数,如下图所示

在OnComm() 函数中,加入串口消息处理函数,处理串口接收的数据,如下图所示

❼ vc++6.0 与 串口

有的本本没有串口的,当然读不到数据^_^

还有一种可能,就是本本的串口坏掉了。可以自己用万用表量一下。我原先调试的时候调了几个小时都没读到数据,后来才发现本本上的串口是坏的,有个引脚的电压为零。

❽ 如何用VC进行串口编程

1、新建MFC对话框工程如下

双击两个Button按钮;

代码中显示如下:

[cpp] view plain print?

  • voidCMSCommTestDlg::OnBnClickedBtnopen()

  • {

  • //TODO:

  • }

  • voidCMSCommTestDlg::OnBnClickedBtnsend()

  • {

  • //TODO:

  • }

  • voidCMSCommTestDlg::OnOncommMscomm1()

  • {

  • //TODO:Addyourmessagehandlercodehere

  • }

  • void CMSCommTestDlg::OnBnClickedBtnopen()

  • {

  • // TODO: Add your control notification handler code here

  • }

  • void CMSCommTestDlg::OnBnClickedBtnsend()

  • {

  • // TODO: Add your control notification handler code here

  • }

  • void CMSCommTestDlg::OnOncommMscomm1()

  • {

  • // TODO: Add your message handler code here

  • }


  • 5、将上面代码补全如下:

    [cpp] view plain print?

  • voidCMSCommTestDlg::OnClickedBtnopen()

  • {

  • //TODO:

  • //如果端口已经开启,那么先关闭

  • if(m_comm1.get_PortOpen())

  • {

  • m_comm1.put_PortOpen(FALSE);

  • }

  • m_comm1.put_CommPort(3);//选择com3,可以根据具体情况更改

  • m_comm1.put_InBufferSize(1024);//设置输入缓冲区的大小,Bytes

  • m_comm1.put_OutBufferSize(1024);//设置输出缓冲区的大小,Bytes

  • m_comm1.put_Settings(_T("9600,n,8,1"));//波特率9600,无校验,8个数据位,停止位1

  • m_comm1.put_InputMode(1);//1:表示以二进制方式检索数据

  • m_comm1.put_RThreshold(1);//参数1表示每当串口接收缓冲区中有多于或等于1个字符时将引发一个接收数据的OnComm事件

  • m_comm1.put_InputLen(0);//设置当前接收区长度是0

  • if(!m_comm1.get_PortOpen())

  • {

  • m_comm1.put_PortOpen(TRUE);

  • }

  • else

  • {

  • AfxMessageBox(_T("Cannotopenserialport!"));

  • }

  • m_comm1.get_Input();//先预读缓冲区以清除残留数据

  • UpdateData(FALSE);

  • }

  • voidCMSCommTestDlg::OnClickedBtnsend()

  • {

  • //TODO:

  • UpdateData(TRUE);

  • m_comm1.put_Output(COleVariant(m_sTXDATA));//发送数据

  • }

  • voidCMSCommTestDlg::OnOncommMscomm1()

  • {

  • //TODO:Addyourmessagehandlercodehere

  • VARIANTvariant_inp;

  • COleSafeArraysafearray_inp;

  • LONGlen,k;

  • BYTErxdata[2048];

  • CStringstrtemp;

  • if(m_comm1.get_CommEvent()==2)//事件值为2表示缓冲区内有字符

  • {

  • variant_inp=m_comm1.get_Input();//读缓冲区

  • safearray_inp=variant_inp;//VARIANT型变量转换为ColeSafeArray型变量

  • len=safearray_inp.GetDim();//得到有效数据长度

  • for(k=0;k<len;k++)

  • {

  • safearray_inp.GetElement(&k,rxdata+k);//转换为BYTE型数组

  • }

  • for(k=0;k<len;k++)//将数组转换为CString型变量

  • {

  • BYTEbt=*(char*)(rxdata+k);//字符型

  • strtemp.Format(_T("%c"),bt);//将字符送入临时变量strtemp存放

  • m_sRXDATA+=strtemp;//接收到的数据放到编辑框对应的变量中

  • }

  • }

  • SetDlgItemText(IDC_EDIT_RXDATA,m_sRXDATA);

  • }

❾ 如何用C语言控制计算机串口

基本方法是使用CreateFile来建立一个串口文件,然后用overlap的方式进行读写

#define SERAIL_PORT_BUF_MAX (1024*8)
typedef HRESULT (*PFN_CMD_PARSE_DATA)(HANDLE hParseApp, LPCSTR szRspCmd, int nCmdLen);

class CUsbSrvApp// : public CWinApp
{
public:
CUsbSrvApp();
~CUsbSrvApp();
BOOL OnSendData(const char *szBuf, int nLen);// 发送数据
int ComConnect(CString strPort); // 连接COM口
HANDLE OpenComPort(CString strPort, int nBaudRate, int nDataBits, int nStopBits, int nParity, int nFlowCtrlType); // 打开串口
void Close(); // 关闭串口

HANDLE m_hCom;
BOOL m_bConnected;
OVERLAPPED m_OverlappedRead;
OVERLAPPED m_OverlappedWrite;
CWinThread *m_pThread;

PFN_CMD_PARSE_DATA m_pRspCmdFunc; // 用来处理接受数据的CALLBACK
HANDLE m_hParseApp;
};

CUsbSrvApp::CUsbSrvApp()
{
// TODO: add construction code here,
// Place all significant initialization in InitInstance
m_bConnected = false;
m_hCom = NULL;
m_pRspCmdFunc = NULL;
}

CUsbSrvApp::~CUsbSrvApp()
{
}
//打开串口通信,并返回串口句柄
HANDLE CUsbSrvApp::OpenComPort(CString strPortName,
int nBaudRate,
int nDataBits,
int nStopBits,
int nParity,
int nFlowCtrlType)
{
DCB dcb;
COMMTIMEOUTS CommTimeOuts ;
COMMCONFIG ComConfig;
HANDLE hComPort;

CString strPort;
strPort.Format("\\\\.\\%s",strPortName); // COM口的文件名应该是 \\.\COMXX

//打开窗口其实就是创建一个文件
hComPort = CreateFile(strPort,
GENERIC_READ | GENERIC_WRITE,
FILE_SHARE_READ | FILE_SHARE_WRITE,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL|FILE_FLAG_OVERLAPPED,
NULL);

if (INVALID_HANDLE_VALUE == hComPort)
return INVALID_HANDLE_VALUE;

// 设置一些COM口通讯参数和OVERLAP
CommTimeOuts.ReadIntervalTimeout = -1;
CommTimeOuts.ReadTotalTimeoutConstant = 0;
CommTimeOuts.ReadTotalTimeoutMultiplier = 0;
CommTimeOuts.WriteTotalTimeoutConstant = 0;
CommTimeOuts.WriteTotalTimeoutMultiplier = 0x1388;
SetCommTimeouts( m_hCom, &CommTimeOuts ) ;

SetDefaultCommConfig(strPortName, &ComConfig, sizeof(COMMCONFIG));
GetCommState(m_hCom, &dcb ) ;

dcb.BaudRate = nBaudRate;
dcb.ByteSize = nDataBits;
dcb.StopBits = nStopBits;
dcb.fParity = (NOPARITY != nParity);
dcb.Parity = nParity;
//set the receive char
dcb.EvtChar = 0x0D;

switch(nFlowCtrlType)
{
case 0: //no flow control
break;

case 1://HARD_FLOW_CTRL:

dcb.fOutxCtsFlow = TRUE;
dcb.fOutxDsrFlow = TRUE;
dcb.fDtrControl = DTR_CONTROL_DISABLE;
dcb.fDsrSensitivity = TRUE;
dcb.fRtsControl = RTS_CONTROL_TOGGLE;
break;

case 2://SOFT_FLOW_CTRL:
dcb.fOutX = TRUE;
dcb.fInX = TRUE;
break;
}
BuildCommDCB(_T("baud=115200 parity=N data=8 stop=1"),&dcb);
SetCommState(hComPort, &dcb ) ;
SetCommMask(hComPort, 0);
SetCommMask(hComPort, EV_RXCHAR|EV_CTS|EV_DSR|EV_RLSD|EV_RING);
SetupComm( hComPort, SERAIL_PORT_BUF_MAX,SERAIL_PORT_BUF_MAX) ;
//clear read and write buffer
PurgeComm( hComPort, PURGE_TXABORT | PURGE_RXABORT | PURGE_TXCLEAR | PURGE_RXCLEAR );

return hComPort;
}

void CUsbSrvApp::Close()
{
if(m_bConnected)
{
m_bConnected = false;
CloseHandle(m_hCom);
m_hCom = NULL;
}
}

// 这个线程是监视串口数据,一旦有数据则读取并调用CALLBACK通知客户端
UINT ReceiveComData(LPVOID pParam)
{
CUsbSrvApp *pUsbSrv = (CUsbSrvApp *)pParam;
HANDLE hComPort = pUsbSrv->m_hCom;

DWORD dwEvtMask=0;
DWORD dwErrorFlags;

SetCommMask( hComPort, EV_RXCHAR);
OVERLAPPED osRead;
osRead.hEvent = CreateEvent(NULL,FALSE,FALSE,NULL);
DWORD dwTransfer = 0;
while(pUsbSrv->m_bConnected)
{
if( !WaitCommEvent( hComPort, &dwEvtMask,&osRead))
{
if( GetLastError()== ERROR_IO_PENDING)
{
WaitForSingleObject(osRead.hEvent, INFINITE);
if(dwEvtMask&EV_RXCHAR==EV_RXCHAR)
{
COMSTAT ComStat={0} ;
DWORD dwReadLen = 0;
DWORD dwBytesRead = 0;
DWORD dwTotalLen = 0;
ClearCommError(hComPort, &dwErrorFlags, &ComStat );
dwTotalLen = ComStat.cbInQue;
dwReadLen = (SERAIL_PORT_BUF_MAX > dwTotalLen)?dwTotalLen:SERAIL_PORT_BUF_MAX;

BYTE *pBuf = new BYTE[dwTotalLen+1];
memset(pBuf, 0 , dwTotalLen+1);
DWORD nReadBufLen=0;
while(dwTotalLen>0)
{

if(FALSE == ReadFile( hComPort, pBuf+nReadBufLen,dwReadLen, &dwBytesRead,&pUsbSrv->m_OverlappedRead))
{
if(GetLastError() == ERROR_IO_PENDING)
{
GetOverlappedResult(hComPort,&osRead, &dwTransfer, TRUE );
}
break;
}

nReadBufLen +=dwBytesRead;
dwTotalLen -=dwBytesRead;
dwReadLen -= dwBytesRead;
dwReadLen = (SERAIL_PORT_BUF_MAX>dwReadLen)?dwReadLen:SERAIL_PORT_BUF_MAX;
}
if(pUsbSrv->m_pRspCmdFunc!=NULL&&nReadBufLen!=0)
{
pUsbSrv->m_pRspCmdFunc(pUsbSrv->m_hParseApp, (char*)pBuf,nReadBufLen);
}

delete pBuf;

ClearCommError(hComPort, &dwErrorFlags, &ComStat );
int len =0;//= m_retList.GetSize();
}//endif if(dwEvtMask&EV_RXCHAR==EV_RXCHAR)
}//endif if( GetLastError()== ERROR_IO_PENDING)
}//endif if( !WaitCommEvent( hComPort, &dwEvtMask,&o))
else
{
if(GetLastError() == ERROR_IO_PENDING) {
GetOverlappedResult(hComPort, &osRead, &dwTransfer, TRUE ); // sleep thread
}
}
Sleep(1);
} //endwhile while(m_bConnected)
return 0;
}

int CUsbSrvApp::ComConnect(CString strPort)
{
int nBaudRate = 115200;
int nDataBits = 8;
int nStopBits = 1;
int nParity = 0;
int nFlowCtrl = 1;

if (NULL != m_hCom || m_bConnected)
{
return 0;
}
m_hCom = OpenComPort(strPort,nBaudRate,nDataBits,nStopBits,nParity,nFlowCtrl);
if( INVALID_HANDLE_VALUE == m_hCom)
{
m_hCom = NULL;
return 0;
}
memset( &m_OverlappedRead, 0, sizeof( OVERLAPPED ) );
memset( &m_OverlappedWrite, 0, sizeof( OVERLAPPED ) );
m_OverlappedRead.hEvent = CreateEvent( NULL, TRUE, FALSE, NULL );
m_OverlappedWrite.hEvent = CreateEvent( NULL, TRUE, FALSE, NULL );

m_pThread = AfxBeginThread( ReceiveComData,(void*)this,THREAD_PRIORITY_NORMAL,0,CREATE_SUSPENDED ,NULL );

if( NULL == m_pThread )
{
CloseHandle( m_hCom );
m_hCom = NULL;
return FALSE;
}
else
{
m_bConnected = TRUE;
m_pThread->ResumeThread( );
}

return TRUE;
}

int CUsbSrvApp::OnSendData(const char *szBuf, int nLen)
{
BOOL bWriteStat;
BOOL bWrite = TRUE;
DWORD dwBytesWrite = 0;
DWORD dwBytesWritten = 0;
int dwByteswrittenTotal = 0;

if (NULL == m_hCom)
return 0;

int nSentTimes=0;

while(dwByteswrittenTotal<nLen&&nSentTimes<10)
{
nSentTimes++;
dwBytesWrite = nLen-dwByteswrittenTotal;
bWriteStat = WriteFile( m_hCom, szBuf+dwByteswrittenTotal, dwBytesWrite, &dwBytesWritten, &m_OverlappedWrite );

if( !bWriteStat)
{
if ( GetLastError() == ERROR_IO_PENDING )
{
dwBytesWritten = 0;
bWrite = FALSE;
}
}
if (!bWrite)
{
bWrite = TRUE;

bWriteStat = GetOverlappedResult(m_hCom, // Handle to COMM port
&m_OverlappedWrite, // Overlapped structure
&dwBytesWritten, // Stores number of bytes sent
TRUE); // Wait flag
//deal with the error code
}
dwByteswrittenTotal += dwBytesWritten;
}
if(dwByteswrittenTotal<nLen)
return 0;
else
return 1;
}

❿ vc6.0 实现串口通信问题

你一定要用C++编么,用现成的不可以么,如果用现成的可以的话你可以用simens的winpcin软件,这个软件是开放的,而且使用很方便。一般的串口通信都能够完成的。
http://www.ad.siemens.com.cn/download/Soft/00002/winpcin.zip