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 // 使图标在工作区矩形中居中 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 } 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();


发布评论