MyModemDlg.cpp
上传用户:hjb520
上传日期:2022-08-08
资源大小:1251k
文件大小:8k
源码类别:

Windows CE

开发平台:

Visual C++

  1. // MyModemDlg.cpp : implementation file
  2. //
  3. #include "stdafx.h"
  4. #include "MyModem.h"
  5. #include "MyModemDlg.h"
  6. #include "DBFEngine.h"
  7. CDbFile g_dbf;
  8. HANDLE hCommDev;
  9. int g_nFirst=0;
  10. BYTE g_sFirst=0;
  11. char c[2];
  12. TCHAR cc[120];
  13. #ifdef _DEBUG
  14. #define new DEBUG_NEW
  15. #undef THIS_FILE
  16. static char THIS_FILE[] = __FILE__;
  17. #endif
  18. /////////////////////////////////////////////////////////////////////////////
  19. // CMyModemDlg dialog
  20. CMyModemDlg::CMyModemDlg(CWnd* pParent /*=NULL*/)
  21. : CDialog(CMyModemDlg::IDD, pParent)
  22. {
  23. //{{AFX_DATA_INIT(CMyModemDlg)
  24. m_sCommand = _T("");
  25. m_sText = _T("");
  26. m_sReceive = _T("");
  27. //}}AFX_DATA_INIT
  28. // Note that LoadIcon does not require a subsequent DestroyIcon in Win32
  29. m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
  30. }
  31. void CMyModemDlg::DoDataExchange(CDataExchange* pDX)
  32. {
  33. CDialog::DoDataExchange(pDX);
  34. //{{AFX_DATA_MAP(CMyModemDlg)
  35. DDX_Text(pDX, IDC_EDIT1, m_sCommand);
  36. DDX_Text(pDX, IDC_EDIT2, m_sText);
  37. DDX_Text(pDX, IDC_EDIT3, m_sReceive);
  38. //}}AFX_DATA_MAP
  39. }
  40. BEGIN_MESSAGE_MAP(CMyModemDlg, CDialog)
  41. //{{AFX_MSG_MAP(CMyModemDlg)
  42. ON_BN_CLICKED(IDC_SEND, OnSend)
  43. ON_BN_CLICKED(IDC_PICKUP, OnPickup)
  44. ON_BN_CLICKED(ID_SENDTEXT, OnSendtext)
  45. ON_BN_CLICKED(ID_SENDTEXT2, OnSendtext2)
  46. ON_EN_SETFOCUS(IDC_EDIT1, OnSetfocusEdit1)
  47. ON_EN_SETFOCUS(IDC_EDIT2, OnSetfocusEdit2)
  48. ON_WM_CHAR()
  49. ON_WM_TIMER()
  50. ON_WM_DESTROY()
  51. //}}AFX_MSG_MAP
  52. END_MESSAGE_MAP()
  53. /////////////////////////////////////////////////////////////////////////////
  54. // CMyModemDlg message handlers
  55. BOOL CMyModemDlg::OnInitDialog()
  56. {
  57. CDialog::OnInitDialog();
  58. // Set the icon for this dialog.  The framework does this automatically
  59. //  when the application's main window is not a dialog
  60. SetIcon(m_hIcon, TRUE); // Set big icon
  61. SetIcon(m_hIcon, FALSE); // Set small icon
  62. CenterWindow(GetDesktopWindow()); // center to the hpc screen
  63. hCommDev=CreateFile(_T("COM1:"),GENERIC_READ | GENERIC_WRITE,
  64. 0,
  65. NULL,
  66. OPEN_EXISTING,
  67. 0,
  68. NULL);
  69. if(hCommDev==(HANDLE)-1)
  70. {
  71. ::MessageBox(NULL,_T("??1????"),_T("????1"),MB_ICONEXCLAMATION);
  72. return 0;
  73. }
  74. DCB PortDCB;
  75. PortDCB.DCBlength = sizeof (DCB);     
  76.   // Get the default port setting information.
  77.   GetCommState (hCommDev, &PortDCB);
  78.   // Change the DCB structure settings.
  79.   PortDCB.BaudRate = 9600;              // Current baud 
  80.   PortDCB.fBinary = TRUE;               // Binary mode; no EOF check 
  81.   PortDCB.fParity = TRUE;               // Enable parity checking 
  82.   PortDCB.fOutxCtsFlow = FALSE;         // No CTS output flow control 
  83.   PortDCB.fOutxDsrFlow = FALSE;         // No DSR output flow control 
  84.   PortDCB.fDtrControl = DTR_CONTROL_ENABLE; 
  85.                                         // DTR flow control type 
  86.   PortDCB.fDsrSensitivity = FALSE;      // DSR sensitivity 
  87.   PortDCB.fTXContinueOnXoff = TRUE;     // XOFF continues Tx 
  88.   PortDCB.fOutX = FALSE;                // No XON/XOFF out flow control 
  89.   PortDCB.fInX = FALSE;                 // No XON/XOFF in flow control 
  90.   PortDCB.fErrorChar = FALSE;           // Disable error replacement 
  91.   PortDCB.fNull = FALSE;                // Disable null stripping 
  92.   PortDCB.fRtsControl = RTS_CONTROL_ENABLE; 
  93.                                         // RTS flow control 
  94.   PortDCB.fAbortOnError = FALSE;        // Do not abort reads/writes on 
  95.                                         // error
  96.   PortDCB.ByteSize = 8;                 // Number of bits/byte, 4-8 
  97.   PortDCB.Parity = NOPARITY;            // 0-4=no,odd,even,mark,space 
  98.   PortDCB.StopBits = ONESTOPBIT;        // 0,1,2 = 1, 1.5, 2 
  99.   // Configure the port according to the specifications of the DCB 
  100.   // structure.
  101.   if (!SetCommState (hCommDev, &PortDCB))
  102.   {
  103.     // Could not create the read thread.
  104.   ::MessageBox (NULL, TEXT("Unable to configure the serial port"), 
  105.                 TEXT("Error"), MB_OK);
  106.     return FALSE;
  107.   }
  108. COMMTIMEOUTS CommTimeouts;
  109.   CommTimeouts.ReadIntervalTimeout = MAXDWORD;  
  110.   CommTimeouts.ReadTotalTimeoutMultiplier = 0;  
  111.   CommTimeouts.ReadTotalTimeoutConstant = 0;    
  112.   CommTimeouts.WriteTotalTimeoutMultiplier = 0;  
  113.   CommTimeouts.WriteTotalTimeoutConstant = 1000;    
  114.   if (!SetCommTimeouts (hCommDev, &CommTimeouts))
  115.   {
  116.     // Could not create the read thread.
  117.   ::MessageBox (NULL,TEXT("Unable to set the time-out parameters"), 
  118.                 TEXT("Error"), MB_OK);
  119.     return 0;
  120.   }
  121.   PurgeComm(hCommDev,PURGE_TXCLEAR);
  122.   PurgeComm(hCommDev,PURGE_RXCLEAR);
  123.   DWORD dw;
  124.   char sc[60];
  125.   g_dbf.WideCharToChar(_T("ATZr"),sc);
  126.   WriteFile(hCommDev,(BYTE*)sc,strlen(sc)*2,&dw,NULL);
  127.   SetTimer(1,55,NULL);
  128. return TRUE;  // return TRUE  unless you set the focus to a control
  129. }
  130. void CMyModemDlg::OnSend() //拨号
  131. {
  132. UpdateData(1);
  133. if(m_sCommand==_T(""))return;
  134. DWORD dw;
  135. m_sCommand=_T("ATDT")+m_sCommand+_T("r");
  136. char sc[60];
  137. g_dbf.WideCharToChar(m_sCommand,sc);
  138. WriteFile(hCommDev,(BYTE*)sc,strlen(sc)*2,&dw,NULL);
  139. }
  140. void CMyModemDlg::OnPickup() //响应拨号
  141. {
  142. DWORD dw;
  143. char sc[60];
  144. g_dbf.WideCharToChar(_T("ATAr"),sc);
  145. WriteFile(hCommDev,(BYTE*)sc,strlen(sc)*2,&dw,NULL);
  146. }
  147. void CMyModemDlg::OnSendtext() //实时发送
  148. {
  149. UpdateData(1);
  150. if(m_sText==_T(""))return;
  151. DWORD dw;
  152. char sc[60];
  153. g_dbf.WideCharToChar(m_sText,sc);
  154. g_dbf.WideCharToChar 
  155. WriteFile(hCommDev,(BYTE*)sc,strlen(sc)*2,&dw,NULL);
  156. }
  157. void CMyModemDlg::OnSendtext2() //发送文件
  158. {
  159. }
  160. void CMyModemDlg::OnCancel() //退出
  161. {
  162. EndDialog(0);
  163. // CDialog::OnCancel();
  164. }
  165. void CMyModemDlg::OnSetfocusEdit1() 
  166. {
  167. m_sCommand=_T("");
  168. UpdateData(0);
  169. }
  170. void CMyModemDlg::OnSetfocusEdit2() 
  171. {
  172. m_sText=_T("");
  173. UpdateData(0);
  174. }
  175. void CMyModemDlg::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags) 
  176. {
  177. // TODO: Add your message handler code here and/or call default
  178. CDialog::OnChar(nChar, nRepCnt, nFlags);
  179. }
  180. void CMyModemDlg::OnTimer(UINT nIDEvent) 
  181. {
  182. BYTE strCommRecvMsg[51];
  183. memset(strCommRecvMsg,0,51);
  184. BYTE bCommRecvMsg[51];
  185. memset(bCommRecvMsg,0,51);
  186. DWORD dw;
  187. BOOL b=ReadFile(hCommDev,strCommRecvMsg,50,&dw,NULL);
  188. if(!b)return;
  189. if(dw<1)return;
  190. CString str,s;
  191. UpdateData(1);
  192. if(dw==1)
  193. {
  194. if(g_nFirst==1)
  195. {
  196. c[0]=(char)g_sFirst;
  197. c[1]=(char)strCommRecvMsg[0];
  198. wsprintf(cc,_T("%s"),g_dbf.CharToWideChar((unsigned char*)c,2));
  199. g_nFirst=0;
  200. g_sFirst=0;
  201. m_sReceive+=cc;
  202. UpdateData(0);
  203. }
  204. else//g_nFirst==0
  205. {
  206. if(IsChinesecharacter(strCommRecvMsg[0]))
  207. {
  208. g_sFirst=strCommRecvMsg[0];
  209. g_nFirst=1;
  210. }
  211. else
  212. {
  213. m_sReceive+=(TCHAR)strCommRecvMsg[0];
  214. UpdateData(0);
  215. g_nFirst=0;
  216. g_sFirst=0;
  217. }
  218. }
  219. }
  220. else//dw>1
  221. {
  222. if(g_nFirst==1)
  223. {
  224. c[0]=(char)g_sFirst;
  225. c[1]=(char)strCommRecvMsg[0];
  226. memcpy(bCommRecvMsg,strCommRecvMsg+1,dw-1);
  227. ProcessChar(bCommRecvMsg,dw-1,str);
  228. wsprintf(cc,_T("%s"),g_dbf.CharToWideChar((unsigned char*)c,2));
  229. m_sReceive+=cc;
  230. m_sReceive+=str;
  231. UpdateData(0);
  232. g_nFirst=0;
  233. g_sFirst=0;
  234. }
  235. else
  236. {
  237. ProcessChar(strCommRecvMsg,dw,str);
  238. m_sReceive+=str;
  239. UpdateData(0);
  240. g_nFirst=0;
  241. g_sFirst=0;
  242. }
  243. }
  244. CDialog::OnTimer(nIDEvent);
  245. }
  246. void CMyModemDlg::OnDestroy() 
  247. {
  248. KillTimer(1);
  249. CDialog::OnDestroy();
  250. }
  251. void CMyModemDlg ::ProcessChar(BYTE* bb,int len,CString& str)
  252. {
  253. str=_T("");
  254. BYTE temp;
  255. int i=0;
  256. while(i<len)
  257. {
  258. temp=bb[i];
  259. if(!IsChinesecharacter(temp))
  260. {
  261. str+=(TCHAR)temp;
  262. i++;
  263. }
  264. else
  265. {
  266. i++;
  267. if(i<len)
  268. {
  269. c[0]=(char)temp;
  270. c[1]=(char)bb[i];
  271. wsprintf(cc,_T("%s"),g_dbf.CharToWideChar((unsigned char*)c,2));
  272. str+=cc;
  273. i++;
  274. }
  275. }
  276. }
  277. }
  278. BOOL CMyModemDlg ::IsChinesecharacter(BYTE ch)
  279. {
  280. if((BYTE)ch>=0x80)
  281. return TRUE;
  282. else
  283.     return FALSE;
  284. }