當前位置:首頁 » 編程語言 » vc60c語言串口

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