2024年5月31日发(作者:)

MFC实现TCP2COM数据转发

本文档主要介绍基于MFC对话框实现TCP网络与串口之间的数据互相转发的过程,包

括该工具的使用说明,软件开发的主要流程,最后附带该软件的相关代码,给有兴趣的MFC

初学者提供一个简单的模板,帮助初学者快速入门。

目录

MFC实现TCP2COM数据转发 ........................................................................................................ 1

一. TCP2COM使用简单介绍 ....................................................................................................... 1

1. TCP服务端与串口互相转发 ................................................................................................ 2

1.1TCP服务端配置 ........................................................................................................... 2

1.2 TCP客户端配置 .......................................................................................................... 2

1.3TCP2COM串口配置 .................................................................................................... 3

1.4虚拟终端串口配置 ..................................................................................................... 3

1.5 TCP Server与终端串口之间互相发送数据验证 ....................................................... 3

2. TCP客户端与串口互相转发 ................................................................................................ 4

2.1 启用工具的TCP服务器 ............................................................................................ 4

2.2 TCP客户端连接配置 .................................................................................................. 4

2.3串口与TCP客户端互发数据验证 ............................................................................. 4

3. UDP服务器与串口互相转发 ............................................................................................... 5

3.1启用UDP服务器 ........................................................................................................ 5

3.2连接UDP服务器 ........................................................................................................ 5

3.3串口与UDP服务器互相发数据验证 ........................................................................ 5

4. UDP与TCP互相转发 ........................................................................................................... 6

4.1UDP与TCP转发配置.................................................................................................. 6

4.2 UDP服务端与TCP服务器互相发数据验证 ............................................................. 6

4.3 UDP服务器与TCP client互相发数据验证 ............................................................... 7

二. TCP2COM工具开发步骤 ....................................................................................................... 7

1. 新建开发项目 ...................................................................................................................... 7

1.1创建MFC对话框 ....................................................................................................... 7

1.2输入项目名称 ............................................................................................................. 7

1.3应用程序类型配置 ..................................................................................................... 8

1.4在资源视图添加各种控件 ......................................................................................... 8

1.5给各种控件新增成员变量 ....................................................................................... 10

1.6在资源视图下新增定时事件 ................................................................................... 10

2. 代码实现 ............................................................................................................................ 10

2.1依次在各个按钮下新增触发事件的函数 ............................................................... 10

2.2添加初始化代码 ....................................................................................................... 11

2.3编译生成exe文件 ................................................................................................... 12

2.4运行exe文件 ........................................................................................................... 12

三. 附加相关代码 ....................................................................................................................... 13

一.TCP2COM使用简单介绍

该软件的主要功能包括:TCP服务端、客户端与串口之间互相转发数据;UDP与串口之

间互相转发数据;TCP客户端之间互相转发数据;UDP与TCP互相转发数据。下面将简单介

绍一下相关功能的使用例子。

工具界面如下图所示:

1. TCP服务端与串口互相转发

1.1TCP服务端配置

1.2 TCP客户端配置

1.3TCP2COM串口配置

选择”COM3<->COM4”这一对虚拟串口,当前使用”COM3”。

1.4虚拟终端串口配置

选择”COM3<->COM4”这一对虚拟串口,当前使用”COM4”。

1.5 TCP Server与终端串口之间互相发送数据验证

2. TCP客户端与串口互相转发

2.1 启用工具的TCP服务器

2.2 TCP客户端连接配置

2.3串口与TCP客户端互发数据验证

3. UDP服务器与串口互相转发

3.1启用UDP服务器

3.2连接UDP服务器

3.3串口与UDP服务器互相发数据验证

4. UDP与TCP互相转发

4.1UDP与TCP转发配置

在已经配置好的基础上,勾选“UDP<->TCP”选项,如下图所示:

4.2 UDP服务端与TCP服务器互相发数据验证

4.3 UDP服务器与TCP client互相发数据验证

二.TCP2COM工具开发步骤

1. 新建开发项目

1.1创建MFC对话框

打开VS2008开发软件,依次点击”文件”->“新建”->”项目”,在项目类型下选择“MFC”,

如下图所示。

1.2输入项目名称

1.3应用程序类型配置

选择”基于对话框”->”在静态库中使用MFC”,点击完成。

1.4在资源视图添加各种控件

在右边工具箱,选择各种控件,如下图所示。

最终生成如下所示的界面:

1.5给各种控件新增成员变量

1.6在资源视图下新增定时事件

新增定时事件,在项目属性那一栏,找到“WM_TIMER”,增加回调函数,如下图所示:

2. 代码实现

2.1依次在各个按钮下新增触发事件的函数

以打开串口为例子,如下所示:

双击该按钮,跳转到对应的事件处理函数。

2.2添加初始化代码

添加位置如下图所示:

2.3编译生成exe文件

点击生成后选择“生成解决方案”->”编译”。

2.4运行exe文件

点击调试->“开始执行”,这个时候就可以开始进行调试了。

三.附加相关代码

// MysocketDlg.h : 头文件

//

#pragma once

#include "afxwin.h"

// CMysocketDlg 对话框

class CMysocketDlg : public CDialog

{

// 构造

public:

CMysocketDlg(CWnd* pParent = NULL); // 标准构造函数

// 对话框数据

enum { IDD = IDD_MYSOCKET_DIALOG };

protected:

virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持

// 实现

protected:

HICON m_hIcon;

// 生成的消息映射函数

virtual BOOL OnInitDialog();

afx_msg void OnSysCommand(UINT nID, LPARAM lParam);

afx_msg void OnPaint();

afx_msg HCURSOR OnQueryDragIcon();

DECLARE_MESSAGE_MAP()

public:

CComboBox m_combo_select;

CString m_strEditRXData;

CString m_strEditTXData;

afx_msg void OnBnClickedButtonConnect();

public:

int sockClient;

int UdpsockClient;

int m_szPort;

char m_szServerAdr[128];

char m_Udp_szServerAdr[128];

int m_Udp_szPort;

int sockServer;

int sockClients[10];

sockaddr_in serverAddr;

HANDLE hCom;

};

void init_sockClients();

int add_sockClients(int sock);

void trns_to_other(int fd, char *buf, int len);

afx_msg void OnBnClickedButtonClose();

afx_msg void OnBnClickedButtonSend();

afx_msg void OnTimer(UINT_PTR nIDEvent);

CString m_ip;

CString m_port;

afx_msg void OnBnClickedButtonSvropen();

afx_msg void OnBnClickedButtonCls();

afx_msg void OnBnClickedButtonConnectUdp();

afx_msg void OnBnClickedButtonCloseUdp();

afx_msg void OnBnClickedButtonClr();

afx_msg void OnCbnSelchangeCombo1();

afx_msg void OnBnClickedButtonOpencom();

CComboBox m_combo_select1;

afx_msg void OnBnClickedButtonClosecom();

afx_msg void OnEnChangeEditSvrport();

void init_serial_param();

void get_serial_param();

CComboBox m_baudrate;

CComboBox m_databit;

CComboBox m_stopbit;

CComboBox m_parity;

int baudrate;

int databit;

char stopbit[4];

char parity[12];

// : 实现文件

//

#include "stdafx.h"

#include "Mysocket.h"

#include "MysocketDlg.h"

#include "uart.h"

#ifdef _DEBUG

#define new DEBUG_NEW

#endif

// 用于应用程序“关于”菜单项的 CAboutDlg 对话框

class CAboutDlg : public CDialog

{

public:

CAboutDlg();

// 对话框数据

enum { IDD = IDD_ABOUTBOX };

protected:

virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持

// 实现

protected:

DECLARE_MESSAGE_MAP()

};

CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)

{

}

void CAboutDlg::DoDataExchange(CDataExchange* pDX)

{

CDialog::DoDataExchange(pDX);

}

BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)

END_MESSAGE_MAP()

// CMysocketDlg 对话框

CMysocketDlg::CMysocketDlg(CWnd* pParent /*=NULL*/)

: CDialog(CMysocketDlg::IDD, pParent)

, m_strEditRXData(_T(""))

, m_strEditTXData(_T(""))

, m_ip(_T(""))

, m_port(_T(""))

{

m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);

}

void CMysocketDlg::DoDataExchange(CDataExchange* pDX)

{

CDialog::DoDataExchange(pDX);

DDX_Text(pDX, IDC_EDIT_RECV, m_strEditRXData);

DDX_Text(pDX, IDC_EDIT_SEND, m_strEditTXData);

DDX_Text(pDX, IDC_EDIT1, m_ip);

DDX_Text(pDX, IDC_EDIT2, m_port);

DDX_Control(pDX, IDC_COMBO1, m_combo_select1);

DDX_Control(pDX, IDC_COMBO_BAUD, m_baudrate);

DDX_Control(pDX, IDC_COMBO_DATABIT, m_databit);

DDX_Control(pDX, IDC_COMBO_STOPBIT, m_stopbit);

DDX_Control(pDX, IDC_COMBO_CHK, m_parity);

}

BEGIN_MESSAGE_MAP(CMysocketDlg, CDialog)

ON_WM_SYSCOMMAND()

ON_WM_PAINT()

ON_WM_QUERYDRAGICON()

//}}AFX_MSG_MAP

ON_BN_CLICKED(IDC_BUTTON_CONNECT, &CMysocketDlg::OnBnClickedButtonConnect)

ON_BN_CLICKED(IDC_BUTTON_CLOSE, &CMysocketDlg::OnBnClickedButtonClose)

ON_BN_CLICKED(IDC_BUTTON_SEND, &CMysocketDlg::OnBnClickedButtonSend)

ON_WM_TIMER()

ON_BN_CLICKED(IDC_BUTTON_SVROPEN, &CMysocketDlg::OnBnClickedButtonSvropen)

ON_BN_CLICKED(IDC_BUTTON_CLS, &CMysocketDlg::OnBnClickedButtonCls)

ON_BN_CLICKED(IDC_BUTTON_CONNECT_UDP,

&CMysocketDlg::OnBnClickedButtonConnectUdp)

ON_BN_CLICKED(IDC_BUTTON_CLOSE_UDP, &CMysocketDlg::OnBnClickedButtonCloseUdp)

ON_BN_CLICKED(IDC_BUTTON_CLR, &CMysocketDlg::OnBnClickedButtonClr)

ON_CBN_SELCHANGE(IDC_COMBO1, &CMysocketDlg::OnCbnSelchangeCombo1)

ON_BN_CLICKED(IDC_BUTTON_OPENCOM, &CMysocketDlg::OnBnClickedButtonOpencom)

ON_BN_CLICKED(IDC_BUTTON_CLOSECOM, &CMysocketDlg::OnBnClickedButtonClosecom)

ON_EN_CHANGE(IDC_EDIT_SVRPORT, &CMysocketDlg::OnEnChangeEditSvrport)

END_MESSAGE_MAP()

// CMysocketDlg 消息处理程序

BOOL CMysocketDlg::OnInitDialog()

{

CDialog::OnInitDialog();

// 将“关于...”菜单项添加到系统菜单中。

// IDM_ABOUTBOX 必须在系统命令范围内。

ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);

ASSERT(IDM_ABOUTBOX < 0xF000);

CMenu* pSysMenu = GetSystemMenu(FALSE);

if (pSysMenu != NULL)

{

CString strAboutMenu;

ring(IDS_ABOUTBOX);

if (!y())

}

{

}

pSysMenu->AppendMenu(MF_SEPARATOR);

pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);

// 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动

// 执行此操作

SetIcon(m_hIcon, TRUE); // 设置大图标

SetIcon(m_hIcon, FALSE); // 设置小图标

//ShowWindow(SW_MINIMIZE);

// TODO: 在此添加额外的初始化代码

m_ip = __T("192.168.7.127");

m_port = __T("8086");

SetDlgItemText(IDC_EDIT1,m_ip);

SetDlgItemText(IDC_EDIT2,m_port);

init_sockClients();

init_serial_param();

#if 1

CStringArray arrCom;

int i = 0;

//AfxMessageBox(__T("1"));

int cnt = GetSerialPort(arrCom);

//AfxMessageBox(__T("2"));

while(i

//AfxMessageBox(__T(arrCom[i]));

m_combo_ing(__T(arrCom[i]));

i++;

}

//AfxMessageBox(__T("2"));

m_combo_Sel(0);

SetDlgItemText(IDC_COMBO1, _T(arrCom[0]));

#endif

return TRUE; // 除非将焦点设置到控件,否则返回 TRUE

}

void CMysocketDlg::OnSysCommand(UINT nID, LPARAM lParam)

{

if ((nID & 0xFFF0) == IDM_ABOUTBOX)

{

CAboutDlg dlgAbout;

l();

}

else

{

}

}

CDialog::OnSysCommand(nID, lParam);

// 如果向对话框添加最小化按钮,则需要下面的代码

// 来绘制该图标。对于使用文档/视图模型的 MFC 应用程序,

// 这将由框架自动完成。

void CMysocketDlg::OnPaint()

{

if (IsIconic())

{

0);

CPaintDC dc(this); // 用于绘制的设备上下文

SendMessage(WM_ICONERASEBKGND, reinterpret_cast(eHdc()),

// 使图标在工作区矩形中居中

int cxIcon = GetSystemMetrics(SM_CXICON);

int cyIcon = GetSystemMetrics(SM_CYICON);

CRect rect;

GetClientRect(&rect);

int x = (() - cxIcon + 1) / 2;

int y = (() - cyIcon + 1) / 2;

// 绘制图标

on(x, y, m_hIcon);

}

else

{

CDialog::OnPaint();

}

}

//当用户拖动最小化窗口时系统调用此函数取得光标

//显示。

HCURSOR CMysocketDlg::OnQueryDragIcon()

{

return static_cast(m_hIcon);

}

void CMysocketDlg::init_sockClients()

{

int i;

sockClient = -1;

UdpsockClient = -1;

for (i = 0; i < 10; i++) {

sockClients[i] = -1;

}

}

int CMysocketDlg::add_sockClients(int sock){

for (int i = 0; i < 10; i++) {

if (sockClients[i] == -1) {

sockClients[i] = sock;

return 1;

}

}

return 0;

}

void CMysocketDlg::OnBnClickedButtonConnect()

{

// TODO: 在此添加控件通知处理程序代码

#if 1

CEdit* pBoxOne;

pBoxOne = (CEdit*) GetDlgItem(IDC_EDIT1);

CString str;

pBoxOne->GetWindowText(str);

//strcpy(m_szServerAdr,str);

strcpy(m_szServerAdr, fer(gth()));

pBoxOne = (CEdit*) GetDlgItem(IDC_EDIT2);

pBoxOne->GetWindowText(str);

int port = _ttoi(str);

if (port == 0) {

port = 5001;

}

m_szPort = port;

if (strlen(m_szServerAdr) == 0) {

//strcpy_s(m_szServerAdr,"192.168.7.127", strlen("192.168.7.127"));

}

//SetTimer(2,1000,NULL);

//TryCount=0;

WORD wVersionRequested;

WSADATA wsaData;

int err;

wVersionRequested = MAKEWORD( 1, 1 );

err = WSAStartup( wVersionRequested, &wsaData );//加载套接字库

if ( err != 0 ) { return; }

if ( LOBYTE( on ) != 1 || HIBYTE( on ) != 1 )

{

WSACleanup( );

return;

}

sockClient=socket(AF_INET,SOCK_STREAM,0);//创建套接字(socket)。

unsigned long ul=1;

ioctlsocket(sockClient,FIONBIO,(unsigned long *)&ul);

SOCKADDR_IN addrSrv;

_addr.S_un.S_addr=inet_addr(m_szServerAdr);

_family=AF_INET;

_port=htons(port);

connect(sockClient,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));//向服务器发出连接请求

(connect)。

//char recvBuf[100];//和服务器端进行通信(send/recv)。

//recv(sockClient,recvBuf,100,0);

//printf("%sn",recvBuf);

//send(sockClient,"UIH",strlen("UIH")+1,0);

// closesocket(sockClient);//关闭套接字。

// WSACleanup();//必须调用这个函数清除参数

//SetTimer(2,500,NULL);

SetTimer(1,500,NULL);

#endif

}

void CMysocketDlg::OnBnClickedButtonClose()

{

// TODO: 在此添加控件通知处理程序代码

if(sockClient>0)

closesocket(sockClient);

for (int i =0;i<10;i++) {

if (sockClients[i] != -1) {

closesocket(sockClients[i]);

}

}

}

void CMysocketDlg::OnBnClickedButtonSend()

{

// TODO: 在此添加控件通知处理程序代码

CEdit* pBoxOne;

char sndbuf[1024] = "";

pBoxOne = (CEdit*) GetDlgItem(IDC_EDIT_SEND);

CString str;

pBoxOne->GetWindowText(str);

//strcpy(m_szServerAdr,str);

strcpy(sndbuf, fer(gth()));

if (sockClient != -1)

send(sockClient,sndbuf,gth(),0);

for (int i =0;i<10;i++) {

if (sockClients[i] != -1) {

send(sockClients[i],sndbuf,gth(),0);

}

}

if(UdpsockClient != -1)

sendto(UdpsockClient, sndbuf, strlen(sndbuf), 0,

sizeof(SOCKADDR));

uart_write(hCom,sndbuf,strlen(sndbuf));

}

void write2file(CString str)

{

#if 0

FILE *fp = fopen("", "ab+");

if(fp) {

char tmpbuf[1024]="";

strcpy(tmpbuf, fer(gth()));

fprintf(fp,"%s", tmpbuf);

fclose(fp);

}

#endif

}

void CMysocketDlg::trns_to_other(int fd, char *buf, int len)

{

for (int i=0;i<10;i++) {

if(sockClients[i]!=fd) {

if (sockClients[i] != -1) {

send(sockClients[i],buf,len,0);

}

}

}

}

void CMysocketDlg::OnTimer(UINT_PTR nIDEvent)

{

// TODO: 在此添加消息处理程序代码和/或调用默认值

int trns = 0,udp2tcp=0;

(SOCKADDR *)&serverAddr,

if (BST_CHECKED == IsDlgButtonChecked(IDC_CHECK_TRNS)) {

trns = 1;

}

if (BST_CHECKED == IsDlgButtonChecked(IDC_CHECK_UDP2TCP)) {

udp2tcp = 1;

}

if (1 == nIDEvent) {

KillTimer(1);

char recvBuf[1024]="";//和服务器端进行通信(send/recv)。

int len = recv(sockClient,recvBuf,1024,0);

if (len>0) {

int hexflag = 0;

CString strtemp;

uart_write(hCom,recvBuf,len);

if(udp2tcp&&(UdpsockClient>0)) {

sendto(UdpsockClient, recvBuf, len, 0, (SOCKADDR

sizeof(SOCKADDR));

}

if (BST_CHECKED == IsDlgButtonChecked(IDC_CHECK_HEX)) {

hexflag = 1;

}

if (hexflag == 1) {

for (int i=0;i

CString temp="";

("%02X ",recvBuf[i]);

strtemp = temp;

}

} else {

("%s",recvBuf);

}

m_strEditRXData+=strtemp;

SetDlgItemText(IDC_EDIT_RECV,m_strEditRXData);

CEdit* pedit = (CEdit*)GetDlgItem(IDC_EDIT_RECV);

pedit->LineScroll(pedit->GetLineCount());

} else if (len == 0) {

AfxMessageBox(__T("close socket!"));

closesocket(sockClient);

sockClient = -1;

}

SetTimer(1,250,NULL);

}

if (2 ==nIDEvent) {

KillTimer(2);

SOCKET sClient;

*)&serverAddr,

sockaddr_in remoteAddr;

int nAddrlen = sizeof(remoteAddr);

sClient = accept(sockServer, (SOCKADDR *)&remoteAddr, &nAddrlen);

if(sClient == INVALID_SOCKET)

{

AfxMessageBox(__T("accept error !"));

}

else {

unsigned long ul=1;

ioctlsocket(sockServer,FIONBIO,(unsigned long *)&ul);

if (add_sockClients(sClient)) {

//AfxMessageBox(__T(inet_ntoa(_addr)));

}

}

for (int i=0;i<10;i++) {

if (sockClients[i] != -1) {

char recvBuf[1024]="";//和服务器端进行通信(send/recv)。

unsigned char recvbuf[1024] = "";

int len = recv(sockClients[i],recvBuf,1024,0);

if (len>0) {

//write_file(recvBuf,len);

uart_write(hCom,recvBuf,len);

if(trns) {

trns_to_other(sockClients[i],recvBuf, len);

}

if(udp2tcp&&(UdpsockClient>0)) {

sendto(UdpsockClient, recvBuf, len, 0, (SOCKADDR *)&serverAddr,

sizeof(SOCKADDR));

}

#if 1

memcpy(recvbuf, recvBuf, len);

CString strtemp,strflag;

("sockfd(%d):",sockClients[i]);

strtemp +=strflag;

int hexflag = 0;

if (BST_CHECKED == IsDlgButtonChecked(IDC_CHECK_HEX)) {

hexflag = 1;

}

if (hexflag == 1) {

for (int i=0;i

CString temp="";

("%02X ",recvbuf[i]&0xff);

strtemp += temp;

}

} else {

("%s",recvBuf);

}

strtemp+="rn";

m_strEditRXData=strtemp;

write2file(strtemp);

//m_strEditRXData+="rn";

SetDlgItemText(IDC_EDIT_RECV,m_strEditRXData);

CEdit* pedit = (CEdit*)GetDlgItem(IDC_EDIT_RECV);

pedit->LineScroll(pedit->GetLineCount());

#endif

}

else if (len <0) {

//AfxMessageBox(__T("recv error !"));

} else {

//AfxMessageBox(__T("close a clinet!"));

closesocket(sockClients[i]);

sockClients[i] = -1;

}

}

}

SetTimer(2,250,NULL);

}

if (3 == nIDEvent) {

KillTimer(3);

char recvBuf[1024]="";//和服务器端进行通信(send/recv)。

int nServerAddrLen=sizeof(sockaddr_in);

// 接收数据

int

len=recvfrom(UdpsockClient,recvBuf,1024,0,(SOCKADDR *)&serverAddr,&nServerAddrLen);

//int len = recv(sockClient,recvBuf,1024,0);

if (len>0) {

int hexflag = 0;

CString strtemp;

uart_write(hCom,recvBuf,len);

if(udp2tcp) {

for (int i=0;i<10;i++) {

if (sockClients[i] >0) {

send(sockClients[i],recvBuf,len,0);

}

}

if(sockClient>0) {

send(sockClient,recvBuf,len,0);

}

}

if (BST_CHECKED == IsDlgButtonChecked(IDC_CHECK_HEX)) {

hexflag = 1;

}

if (hexflag == 1) {

for (int i=0;i

CString temp="";

("%02X ",recvBuf[i]);

strtemp += temp;

}

} else {

("%s",recvBuf);

}

m_strEditRXData+=strtemp;

SetDlgItemText(IDC_EDIT_RECV,m_strEditRXData);

CEdit* pedit = (CEdit*)GetDlgItem(IDC_EDIT_RECV);

pedit->LineScroll(pedit->GetLineCount());

} else if (len == 0) {

AfxMessageBox(__T("close socket!"));

closesocket(sockClient);

sockClient = -1;

}

SetTimer(3,250,NULL);

}

if (10 ==nIDEvent) {

KillTimer(10);

char recvbuf[2048] = "";

int len;

len = uart_read(hCom,recvbuf, sizeof(recvbuf));

if (len>0) {

for (int i =0;i<10;i++) {

if (sockClients[i] != -1) {

send(sockClients[i],recvbuf,len,0);

}

}

if(UdpsockClient != -1)

sendto(UdpsockClient, recvbuf, len, 0, (SOCKADDR

sizeof(SOCKADDR));

if(sockClient>0)

send(sockClient,recvbuf, len, 0);

CString str;

*)&serverAddr,

str+="com->sk:";

if (BST_CHECKED == IsDlgButtonChecked(IDC_CHECK_HEX)) {

CString tmp="";

int i;

for (i = 0; i

(__T("%02x "),recvbuf[i]&0xff);

str+=tmp;

}

str+="rn";

m_strEditRXData+=str;

write2file(str);

SetDlgItemText(IDC_EDIT_RECV,m_strEditRXData);

} else {

(__T("%s"),recvbuf);

m_strEditRXData+=str;

m_strEditRXData+="rn";

SetDlgItemText(IDC_EDIT_RECV,m_strEditRXData);

}

CEdit* pedit = (CEdit*)GetDlgItem(IDC_EDIT_RECV);

pedit->LineScroll(pedit->GetLineCount());

}

SetTimer(10,250,NULL);

}

CDialog::OnTimer(nIDEvent);

}

void CMysocketDlg::OnBnClickedButtonSvropen()

{

// TODO: 在此添加控件通知处理程序代码

WORD sockVersion = MAKEWORD(2,2);

WSADATA wsaData;

if(WSAStartup(sockVersion, &wsaData)!=0)

{

return ;

}

//创建套接字

sockServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);

if(sockServer == INVALID_SOCKET)

{

AfxMessageBox(__T("socket error !"));

return ;

}

int port;

CEdit* pBoxOne;

pBoxOne = (CEdit*) GetDlgItem(IDC_EDIT_SVRPORT);

CString str;

pBoxOne->GetWindowText(str);

port = _ttoi(str);

if (port == 0) {

port = 5001;

}

//绑定IP和端口

sockaddr_in sin;

_family = AF_INET;

_port = htons(port);

_addr.S_un.S_addr = INADDR_ANY;

if(bind(sockServer, (LPSOCKADDR)&sin, sizeof(sin)) == SOCKET_ERROR)

{

//printf("bind error !");

AfxMessageBox(__T("bind error !"));

}

//开始监听

if(listen(sockServer, 10) == SOCKET_ERROR)

{

//printf("listen error !");

AfxMessageBox(__T("listen error !"));

return ;

}

unsigned long ul=1;

ioctlsocket(sockServer,FIONBIO,(unsigned long *)&ul);

SetTimer(2, 500, NULL);

}

void CMysocketDlg::OnBnClickedButtonCls()

{

// TODO: 在此添加控件通知处理程序代码

for (int i=0;i<10;i++) {

if (sockClients[i] != -1)

closesocket(sockClients[i]);

}

}

void CMysocketDlg::OnBnClickedButtonConnectUdp()

{

// TODO: 在此添加控件通知处理程序代码

WSADATA wsa;

if (WSAStartup(MAKEWORD(2, 2), &wsa) != 0)

{

AfxMessageBox(__T("WSAStartup failedn"));

return ;

}

//建立一个UDP的socket

UdpsockClient = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);

if (UdpsockClient == SOCKET_ERROR)

{

AfxMessageBox(__T("create socket failedn"));

return ;

}

CEdit* pBoxOne;

pBoxOne = (CEdit*) GetDlgItem(IDC_EDIT3);

CString str;

pBoxOne->GetWindowText(str);

//strcpy(m_szServerAdr,str);

strcpy(m_Udp_szServerAdr, fer(gth()));

pBoxOne = (CEdit*) GetDlgItem(IDC_EDIT_SVRPORT_UDP);

pBoxOne->GetWindowText(str);

int port = _ttoi(str);

if (port == 0) {

port = 5001;

}

m_Udp_szPort = port;

//绑定地址信息

_family = AF_INET;

_port = htons(m_Udp_szPort);

//_addr.S_un.S_addr = htonl(INADDR_ANY);

_addr.S_un.S_addr = inet_addr(m_Udp_szServerAdr);

//bind(UdpsockClient, (sockaddr*)&serverAddr, sizeof(sockaddr));

unsigned long ul=1;

ioctlsocket(UdpsockClient,FIONBIO,(unsigned long *)&ul);

SetTimer(3, 500, NULL);

}

void CMysocketDlg::OnBnClickedButtonCloseUdp()

{

// TODO: 在此添加控件通知处理程序代码

closesocket(UdpsockClient);

UdpsockClient = -1;

}

void CMysocketDlg::OnBnClickedButtonClr()

{

// TODO: 在此添加控件通知处理程序代码

m_strEditRXData = "";

SetDlgItemText(IDC_EDIT_RECV,m_strEditRXData);

CEdit* pedit = (CEdit*)GetDlgItem(IDC_EDIT_RECV);

pedit->LineScroll(pedit->GetLineCount());

}

void CMysocketDlg::OnCbnSelchangeCombo1()

{

// TODO: 在此添加控件通知处理程序代码

int iPos=((CComboBox*)GetDlgItem(IDC_COMBO1))->GetCurSel();

}

void CMysocketDlg::OnBnClickedButtonOpencom()

{

// TODO: 在此添加控件通知处理程序代码

int iPos=((CComboBox*)GetDlgItem(IDC_COMBO1))->GetCurSel();

char com[10] = "";

CString str1,str2;

m_combo_ext(iPos,str1);

//AfxMessageBox(__T(str1));

strcpy(com, str1);

//strcpy(com, "COM4");

get_serial_param();

hCom = uart_open(com,baudrate);

uart_set_param(hCom,databit, stopbit, parity);

("%d %d %s %s", baudrate,databit,stopbit,parity);

AfxMessageBox(__T(str2));

if (INVALID_HANDLE_VALUE != hCom) {

AfxMessageBox(__T("打开串口")+str1);

SetTimer(10,1000,NULL);

}

else

AfxMessageBox(__T("打开串口失败 "));

}

void CMysocketDlg::OnBnClickedButtonClosecom()

{

// TODO: 在此添加控件通知处理程序代码

uart_close(hCom);

}

void CMysocketDlg::OnEnChangeEditSvrport()

{

// TODO: 如果该控件是 RICHEDIT 控件,则它将不会

// 发送该通知,除非重写 CDialog::OnInitDialog()

// 函数并调用 CRichEditCtrl().SetEventMask(),

// 同时将 ENM_CHANGE 标志“或”运算到掩码中。

// TODO: 在此添加控件通知处理程序代码

}

void CMysocketDlg::init_serial_param()

{

char

baud[][32]={"110","300","600","1200","2400","4800","9600","19200","38400","57600","115200

","230400"};

int baudcnt=sizeof(baud)/sizeof(baud[0]);

int i=0;

m_ontent();

for(i=0;i

m_ing(__T(baud[i]));

}

SetDlgItemText(IDC_COMBO_BAUD, _T("115200"));

char databit[][32]={"8","7","6","5"};

int databitcnt=sizeof(databit)/sizeof(databit[0]);

for(i=0;i

m_ing(__T(databit[i]));

}

SetDlgItemText(IDC_COMBO_DATABIT, _T(databit[0]));

char stopbit[][32]={"1","2","0"};

int stopbitcnt=sizeof(stopbit)/sizeof(stopbit[0]);

for(i=0;i

m_ing(__T(stopbit[i]));

}

SetDlgItemText(IDC_COMBO_STOPBIT, _T(stopbit[0]));

char checkbit[][32]={"None","Odd","Even"};

int checkbitcnt=sizeof(checkbit)/sizeof(checkbit[0]);

for(i=0;i

m_ing(__T(checkbit[i]));

}

SetDlgItemText(IDC_COMBO_CHK, _T(checkbit[0]));

}

void CMysocketDlg::get_serial_param()

{

CString retStr;

m_dowText(retStr);

baudrate = atoi(retStr);

m_dowText(retStr);

databit = atoi(retStr);

m_dowText(retStr);

strcpy(stopbit, fer());

m_dowText(retStr);

strcpy(parity, fer());

}

#ifndef __UART_H__

#define __UART_H__

#include

//CBR_115200,CBR_57600,CBR_56000,CBR_38400,CBR_19200,CBR_14400,CBR_9600,CBR_4800,

CBR_2400,CBR_1200,CBR_600,CBR_300,CBR_110

HANDLE uart_open(CString CommName, int rate);

int uart_write(HANDLE hCom, void *pSrc, int len);

int uart_read(HANDLE hCom, void *pRet, int retLen);

int uart_read_count(HANDLE hCom);

int uart_close(HANDLE hCom);

void uart_empty(HANDLE hCom);

void uart_set_speed(HANDLE hCom, int speed);

int GetSerialPort(CStringArray &arrCom);

int uart_set_param(HANDLE hCom,int dataSize,char *pStopBitStr,char *pParityStr);

void uart_set_rts(HANDLE hCom, int isEnable);

#endif

#include "stdafx.h"

#include "uart.h"

HANDLE uart_open(CString CommName, int rate)

{

if(gth()>4)

(0,".");

HANDLE

hCom=CreateFile(CommName,GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,0,NULL)

;

COMMTIMEOUTS TimeOuts;

if(hCom==INVALID_HANDLE_VALUE)

return hCom;

uart_set_speed(hCom, rate);

SetupComm(hCom, 10*1024,10*1024);//set in out buf size

//设定读超时

tervalTimeout=10;

talTimeoutMultiplier=10;

talTimeoutConstant=10;

//设定写超时

otalTimeoutMultiplier=10;

otalTimeoutConstant=10;

SetCommTimeouts(hCom,&TimeOuts);

PurgeComm(hCom, PURGE_TXCLEAR|PURGE_RXCLEAR);//clear rx tx

return hCom;

}

int uart_write(HANDLE hCom, void *pSrc, int len)

{

DWORD writeLen=0;

DWORD sendLen = len;

#if 1

unsigned char *pTmp = (unsigned char*)pSrc;

while(len>0){

writeLen=0;

WriteFile(hCom, pTmp, (DWORD)1, &writeLen, NULL);

len--;

pTmp++;

}

#else

// Clear buffer

//PurgeComm(hCom, PURGE_TXCLEAR | PURGE_TXABORT);

if(WriteFile(hCom, pSrc, (DWORD)len, &writeLen, NULL)==FALSE)

return 0;

#endif

return (int)sendLen;

}

int uart_read(HANDLE hCom, void *pRet, int retLen)

{

DWORD readLen=0;

if(uart_read_count(hCom)<=0)

return 0;

if(ReadFile(hCom, pRet, retLen, &readLen, NULL)==FALSE)

return 0;

return (int)readLen;

}

int uart_read_count(HANDLE hCom)

{

DWORD errors;

COMSTAT Stat;

if(ClearCommError(hCom, &errors, &Stat) == FALSE)

return 0;

return (int)e;

}

int uart_close(HANDLE hCom)

{

if(hCom==INVALID_HANDLE_VALUE)

return 0;

return CloseHandle(hCom);

}

void uart_empty(HANDLE hCom)

{

PurgeComm(hCom, PURGE_RXCLEAR);

}

void uart_set_rts(HANDLE hCom, int isEnable)

{

DCB dcbParam;

if(GetCommState(hCom, &dcbParam) == FALSE)

{

uart_close(hCom);

return;

}

if(isEnable){

ntrol = RTS_CONTROL_ENABLE;

}else{

ntrol = RTS_CONTROL_DISABLE;

}

SetCommState(hCom, &dcbParam);//set uart param

}

void uart_set_speed(HANDLE hCom, int speed)

{

DCB dcbParam;

DWORD tab[] =

{0,CBR_115200,CBR_57600,CBR_56000,CBR_38400,CBR_19200,CBR_14400,CBR_9600,CBR_4800

,CBR_2400,CBR_1200,CBR_600,CBR_300,CBR_110};

if(GetCommState(hCom, &dcbParam) == FALSE)

{

uart_close(hCom);

return;

}

te = speed;

ze = 8;

= NOPARITY;

ts = ONESTOPBIT;

ntrol = RTS_CONTROL_DISABLE;

tsFlow = false;

SetCommState(hCom, &dcbParam);//set uart param

}

int uart_set_param(HANDLE hCom,int dataSize,char *pStopBitStr,char *pParityStr)

{

DCB dcbParam;

DCB retParam;

if(GetCommState(hCom, &dcbParam) == FALSE){

return 0;

}

ze = dataSize;

if(strcmp(pStopBitStr,"1")==0){

ts = ONESTOPBIT;

}else if(strcmp(pStopBitStr,"1.5")==0){

ts = ONE5STOPBITS;

}else if(strcmp(pStopBitStr,"2")==0){

ts = TWOSTOPBITS;

}

//None;Odd;Even;Mark;Space;

if(strcmp(pParityStr,"None")==0){

= NOPARITY;

}else if(strcmp(pParityStr,"Odd")==0){

}

= ODDPARITY;

}else if(strcmp(pParityStr,"Even")==0){

= EVENPARITY;

}else if(strcmp(pParityStr,"Mark")==0){

= MARKPARITY;

}else if(strcmp(pParityStr,"Space")==0){

= SPACEPARITY;

}

SetCommState(hCom, &dcbParam);//set uart param

GetCommState(hCom, &retParam);

if(memcmp(&dcbParam,&retParam,sizeof(DCB))){

return 0;

}

return 1;

int GetSerialPort(CStringArray &arrCom) //遍历计算机中有哪些串口

{

//CStringArray ary;

All();

HKEY hkey;

LONG

lRes=RegOpenKeyEx(HKEY_LOCAL_MACHINE,_T("HARDWAREDEVICEMAPSERIALCOMM"),

NULL, KEY_QUERY_VALUE | KEY_ENUMERATE_SUB_KEYS | KEY_READ, &hkey);

if (lRes == ERROR_SUCCESS)

{

TCHAR tchKey[MAX_PATH];

TCHAR tchValue[20];

DWORD dwIndex = 0;

DWORD dwType = REG_SZ;

while(lRes == ERROR_SUCCESS)

{

DWORD dwCount = MAX_PATH;

DWORD dwVCount = 20;

lRes = RegEnumValue(hkey, dwIndex++,tchKey, &dwCount,NULL,&dwType,

(LPBYTE)tchValue, &dwVCount);

if(lRes == ERROR_SUCCESS)

{

if((dwVCount > 0) && (dwCount > 0))

{

(tchValue);

}

}

}

}

}

RegCloseKey(hkey);

return e();