求助:RS232串口通信控制 十万火急!!!!!

时间:2021-04-11 07:53:46
谢谢大家了,帮我想一下!!!!!!!!!急用~~

      
                       “微机原理与接口技术”课程设计 
一、设计题目 
     rs232串口通信控制 
二、设计内容 
    利用微机自带的2个串口以及串口连接电缆模拟实现串口通信,用高级程序语言设计并实现一个用于win9x/2k/nt平台的串口监视、调试程序。并可以在线设置各种通信速率、奇偶校验、通信口而无需重新启动程序;可以自动显示接收到数据,并能在字符串10进制和16进制之间*切换。 
三、需提交材料内容 
    除需提交可运行的程序源代码外,还要课程设计文挡说明,文挡说明包括以下三部分:1,系统分析与设计、2,关键技术与算法、3,程序流程框图及源程序(附功能模块注释)。 
   

15 个解决方案

#1


《Visual C++串口通信技术与工程实践》这本书的第八章,完全符合你的要求
不过,总体上这本书挺烂的

#2


找不到这本书啊~~~~~~~

#3


Help,help,help!!!!!
请进来的各位高手帮帮忙啊!!
分不够可以再加

#4


告诉你的邮箱,给你传一个。

#5


邮箱:lisaforever@163.com

#6


拜托了~~~~

#7


呵呵,《Visual C++串口通信技术与工程实践》 真的不怎么样!

#8


《串行通讯开发指南》

#9


《Visual C++串口通信技术与工程实践》那本书虽然不太好但是还帮过我的大忙,那书是不太好找,不过工程实践这方面的书特少,几乎没有。我是初学者,编过用232口控制的小程序,水平教低但愿有帮助,一个232口的类和你的要求可能在细节上不太一样,我想都差不多
// SoemComm.h: interface for the CSoemComm class.
//
//////////////////////////////////////////////////////////////////////

#if !defined(AFX_SOEMCOMM_H__9B52E661_C690_11D6_88E2_0000B4877ECA__INCLUDED_)
#define AFX_SOEMSCALE_H__9B52E661_C690_11D6_88E2_0000B4877ECA__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
const int DEFAULT_BAUD_RATE = 2400;
const int COM1 = 1;
const int COM2 = 2;
 

class CSoemComm
{
public:
CSoemComm(char nComm =COM2,int nBaudRate=2400);//COM2,2400是我的程序要求,你可改
virtual ~CSoemComm();
    void SetComm(char nComm);
void SetParity(char nParity);//设置波特率
int GetComm() const;//
int GetBaudRate() const;//取得得拨特率

bool InitComm() ;//初始化串口
    BOOL Close();
bool Read(char *pBuffer, DWORD dwReadCount);//读
bool Write(const char *pBuffer, DWORD dwWriteCount);//写

private:
    char m_nComm; //Comm通信口。
    char m_nParity;//奇偶校验方式。
int m_nBaudRate; //波特率。
bool m_bCommInited; //是否已经初始化了Comm接口。


HANDLE m_hComm; //串口句柄。

};
#endif // !defined(AFX_SOEMCOMM_H__9B52E661_C690_11D6_88E2_0000B4877ECA__INCLUDED_)
// SoemComm.cpp: implementation of the CSoemComm class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "SoemComm.h"

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CSoemComm::CSoemComm(char nComm , int nBaudRate )
{
m_nComm = nComm;
m_nBaudRate = nBaudRate;
m_bCommInited = false;
m_hComm = INVALID_HANDLE_VALUE;
}

CSoemComm::~CSoemComm()
{
 
if (m_hComm != INVALID_HANDLE_VALUE) {
::CloseHandle(m_hComm);
m_hComm = INVALID_HANDLE_VALUE;
}
}
void CSoemComm::SetComm(char nComm)
{
m_nComm = nComm;

}
void CSoemComm::SetParity(char nParity)
{
m_nParity = nParity;
    InitComm();
}

int CSoemComm::GetComm() const
{
return m_nComm;
}

int CSoemComm::GetBaudRate() const
{
return m_nBaudRate;
}

bool CSoemComm::Read(char *pBuffer, DWORD dwReadCount)
{
ASSERT(pBuffer != NULL);

 
    if (!m_bCommInited)
{
if (!InitComm())
{
return false;
}

 
 
    DWORD dwReadCount2 = 0;

 
BOOL L=ReadFile(
m_hComm,
        pBuffer,
        dwReadCount,
        &dwReadCount2,
0);

    if(!L) 
return false;
if (dwReadCount!=dwReadCount2) 
return false;
return true;

}

bool CSoemComm::Write(const char *pBuffer, DWORD dwWriteCount)
{
ASSERT(pBuffer != NULL);
 
 
if (!m_bCommInited)
{
if (!InitComm())
{
return false;
}
}

DWORD dwWriteCount2 = 0; 
 
    BOOL ret=WriteFile(
m_hComm,
        pBuffer,
        dwWriteCount,
        &dwWriteCount2,
0);
if (!ret) 
return false;
if (dwWriteCount!=dwWriteCount) 
return false;
return true;
}

bool CSoemComm::InitComm() 
{
bool ret = false;
    
 
if (INVALID_HANDLE_VALUE != m_hComm) 
{
if (!CloseHandle(m_hComm)) 
return false;
}

 
CString strComm;
strComm.Format("COM%d", m_nComm);
m_hComm = CreateFile(
    strComm, 
GENERIC_READ | GENERIC_WRITE,  
0,  
NULL, 
OPEN_EXISTING,  
     0,  
    0 
);
    if (INVALID_HANDLE_VALUE == m_hComm)
{
ret = false;
goto EXIT2;
}

 
DCB dcb;
   
GetCommState(m_hComm, &dcb);
{   
 
CString str;
str.Format("%d, %c, 8, 1", m_nBaudRate, m_nParity);
 
              
    ::BuildCommDCB(str, &dcb);
 
}
    if (!SetCommState(m_hComm, &dcb))
{
ret = false;
goto EXIT;
}

    
COMMTIMEOUTS TimeOuts;
    TimeOuts.ReadIntervalTimeout=MAXDWORD;//1  TimeOutsRead=3*bytes_to_read)+2
    TimeOuts.ReadTotalTimeoutConstant=6000;//2
    TimeOuts.ReadTotalTimeoutMultiplier=0;//3
    TimeOuts.WriteTotalTimeoutConstant=6000;//4 TimeOutsWrite=5*bytes_to_write)+4
    TimeOuts.WriteTotalTimeoutMultiplier=1000;//5
    if(!SetCommTimeouts(m_hComm,&TimeOuts))//
{
ret=false;
        goto EXIT;

   ret = true;
       m_bCommInited = ret;
EXIT:
if (!ret)

  {
     CloseHandle(m_hComm);
  }

EXIT2:return ret;
}
//close the commumincating device
BOOL CSoemComm::Close()
{
    BOOL b = FALSE;
    if (m_bCommInited) {
        b = ::CloseHandle(m_hComm);
        m_bCommInited = FALSE;
    }
    return b;
}

#10


我要一个lomos@eyou.com

#11


http://www.gjwtech.com/上面串口例子多的是,你看看吧

#12


楼主,已经给你传过去了,推荐你看一本关于c++builder串口编程的书
(具体书名忘了)很不错的!!!

#13


rs232串口通信控制,我现在正在看这个东东,我这里还有rs422的呢!都是做好的程序!
不过,不好意思,这是公司机密不能泄漏!^_^
这是为军方写的程序哦!!!

#14


接分!!

#15


《串口通信开发实例导航》人民邮电的。里面好像有你要的例程。也许一样!!!

#1


《Visual C++串口通信技术与工程实践》这本书的第八章,完全符合你的要求
不过,总体上这本书挺烂的

#2


找不到这本书啊~~~~~~~

#3


Help,help,help!!!!!
请进来的各位高手帮帮忙啊!!
分不够可以再加

#4


告诉你的邮箱,给你传一个。

#5


邮箱:lisaforever@163.com

#6


拜托了~~~~

#7


呵呵,《Visual C++串口通信技术与工程实践》 真的不怎么样!

#8


《串行通讯开发指南》

#9


《Visual C++串口通信技术与工程实践》那本书虽然不太好但是还帮过我的大忙,那书是不太好找,不过工程实践这方面的书特少,几乎没有。我是初学者,编过用232口控制的小程序,水平教低但愿有帮助,一个232口的类和你的要求可能在细节上不太一样,我想都差不多
// SoemComm.h: interface for the CSoemComm class.
//
//////////////////////////////////////////////////////////////////////

#if !defined(AFX_SOEMCOMM_H__9B52E661_C690_11D6_88E2_0000B4877ECA__INCLUDED_)
#define AFX_SOEMSCALE_H__9B52E661_C690_11D6_88E2_0000B4877ECA__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
const int DEFAULT_BAUD_RATE = 2400;
const int COM1 = 1;
const int COM2 = 2;
 

class CSoemComm
{
public:
CSoemComm(char nComm =COM2,int nBaudRate=2400);//COM2,2400是我的程序要求,你可改
virtual ~CSoemComm();
    void SetComm(char nComm);
void SetParity(char nParity);//设置波特率
int GetComm() const;//
int GetBaudRate() const;//取得得拨特率

bool InitComm() ;//初始化串口
    BOOL Close();
bool Read(char *pBuffer, DWORD dwReadCount);//读
bool Write(const char *pBuffer, DWORD dwWriteCount);//写

private:
    char m_nComm; //Comm通信口。
    char m_nParity;//奇偶校验方式。
int m_nBaudRate; //波特率。
bool m_bCommInited; //是否已经初始化了Comm接口。


HANDLE m_hComm; //串口句柄。

};
#endif // !defined(AFX_SOEMCOMM_H__9B52E661_C690_11D6_88E2_0000B4877ECA__INCLUDED_)
// SoemComm.cpp: implementation of the CSoemComm class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "SoemComm.h"

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CSoemComm::CSoemComm(char nComm , int nBaudRate )
{
m_nComm = nComm;
m_nBaudRate = nBaudRate;
m_bCommInited = false;
m_hComm = INVALID_HANDLE_VALUE;
}

CSoemComm::~CSoemComm()
{
 
if (m_hComm != INVALID_HANDLE_VALUE) {
::CloseHandle(m_hComm);
m_hComm = INVALID_HANDLE_VALUE;
}
}
void CSoemComm::SetComm(char nComm)
{
m_nComm = nComm;

}
void CSoemComm::SetParity(char nParity)
{
m_nParity = nParity;
    InitComm();
}

int CSoemComm::GetComm() const
{
return m_nComm;
}

int CSoemComm::GetBaudRate() const
{
return m_nBaudRate;
}

bool CSoemComm::Read(char *pBuffer, DWORD dwReadCount)
{
ASSERT(pBuffer != NULL);

 
    if (!m_bCommInited)
{
if (!InitComm())
{
return false;
}

 
 
    DWORD dwReadCount2 = 0;

 
BOOL L=ReadFile(
m_hComm,
        pBuffer,
        dwReadCount,
        &dwReadCount2,
0);

    if(!L) 
return false;
if (dwReadCount!=dwReadCount2) 
return false;
return true;

}

bool CSoemComm::Write(const char *pBuffer, DWORD dwWriteCount)
{
ASSERT(pBuffer != NULL);
 
 
if (!m_bCommInited)
{
if (!InitComm())
{
return false;
}
}

DWORD dwWriteCount2 = 0; 
 
    BOOL ret=WriteFile(
m_hComm,
        pBuffer,
        dwWriteCount,
        &dwWriteCount2,
0);
if (!ret) 
return false;
if (dwWriteCount!=dwWriteCount) 
return false;
return true;
}

bool CSoemComm::InitComm() 
{
bool ret = false;
    
 
if (INVALID_HANDLE_VALUE != m_hComm) 
{
if (!CloseHandle(m_hComm)) 
return false;
}

 
CString strComm;
strComm.Format("COM%d", m_nComm);
m_hComm = CreateFile(
    strComm, 
GENERIC_READ | GENERIC_WRITE,  
0,  
NULL, 
OPEN_EXISTING,  
     0,  
    0 
);
    if (INVALID_HANDLE_VALUE == m_hComm)
{
ret = false;
goto EXIT2;
}

 
DCB dcb;
   
GetCommState(m_hComm, &dcb);
{   
 
CString str;
str.Format("%d, %c, 8, 1", m_nBaudRate, m_nParity);
 
              
    ::BuildCommDCB(str, &dcb);
 
}
    if (!SetCommState(m_hComm, &dcb))
{
ret = false;
goto EXIT;
}

    
COMMTIMEOUTS TimeOuts;
    TimeOuts.ReadIntervalTimeout=MAXDWORD;//1  TimeOutsRead=3*bytes_to_read)+2
    TimeOuts.ReadTotalTimeoutConstant=6000;//2
    TimeOuts.ReadTotalTimeoutMultiplier=0;//3
    TimeOuts.WriteTotalTimeoutConstant=6000;//4 TimeOutsWrite=5*bytes_to_write)+4
    TimeOuts.WriteTotalTimeoutMultiplier=1000;//5
    if(!SetCommTimeouts(m_hComm,&TimeOuts))//
{
ret=false;
        goto EXIT;

   ret = true;
       m_bCommInited = ret;
EXIT:
if (!ret)

  {
     CloseHandle(m_hComm);
  }

EXIT2:return ret;
}
//close the commumincating device
BOOL CSoemComm::Close()
{
    BOOL b = FALSE;
    if (m_bCommInited) {
        b = ::CloseHandle(m_hComm);
        m_bCommInited = FALSE;
    }
    return b;
}

#10


我要一个lomos@eyou.com

#11


http://www.gjwtech.com/上面串口例子多的是,你看看吧

#12


楼主,已经给你传过去了,推荐你看一本关于c++builder串口编程的书
(具体书名忘了)很不错的!!!

#13


rs232串口通信控制,我现在正在看这个东东,我这里还有rs422的呢!都是做好的程序!
不过,不好意思,这是公司机密不能泄漏!^_^
这是为军方写的程序哦!!!

#14


接分!!

#15


《串口通信开发实例导航》人民邮电的。里面好像有你要的例程。也许一样!!!