Form1.cs
上传用户:svehicle
上传日期:2013-07-27
资源大小:62k
文件大小:17k
源码类别:

C#编程

开发平台:

C#

  1. using System;
  2. using System.Drawing;
  3. using System.Collections;
  4. //using System.ComponentModel;
  5. using System.Windows.Forms;
  6. using System.Data;
  7. using System.Runtime.InteropServices; 
  8. using System.Threading;
  9. namespace SerialAPI 
  10. /// <summary> 
  11. /// SerialPort 的摘要说明。 
  12. /// </summary> 
  13. public class SerialPort 
  14. #region 申明要引用的和串口调用有关的API 
  15. //win32 api constants 
  16. private const uint GENERIC_READ = 0x80000000; 
  17. private const uint GENERIC_WRITE = 0x40000000; 
  18. private const int OPEN_EXISTING = 3; 
  19. private const int INVALID_HANDLE_VALUE = -1; 
  20. private const int MAXBLOCK = 4096; 
  21. private const uint PURGE_TXABORT = 0x0001; // Kill the pending/current writes to the comm port. 
  22. private const uint PURGE_RXABORT = 0x0002; // Kill the pending/current reads to the comm port. 
  23. private const uint PURGE_TXCLEAR = 0x0004; // Kill the transmit queue if there. 
  24. private const uint PURGE_RXCLEAR = 0x0008; // Kill the typeahead buffer if there. 
  25. [StructLayout(LayoutKind.Sequential)] 
  26. private struct DCB 
  27. //taken from c struct in platform sdk 
  28. public int DCBlength; // sizeof(DCB) 
  29. public int BaudRate; // current baud rate 
  30. public int fBinary; // binary mode, no EOF check 
  31. public int fParity; // enable parity checking 
  32. public int fOutxCtsFlow; // CTS output flow control 
  33. public int fOutxDsrFlow; // DSR output flow control 
  34. public int fDtrControl; // DTR flow control type 
  35. public int fDsrSensitivity; // DSR sensitivity 
  36. public int fTXContinueOnXoff; // XOFF continues Tx 
  37. public int fOutX; // XON/XOFF out flow control 
  38. public int fInX; // XON/XOFF in flow control 
  39. public int fErrorChar; // enable error replacement 
  40. public int fNull; // enable null stripping 
  41. public int fRtsControl; // RTS flow control 
  42. public int fAbortOnError; // abort on error 
  43. public int fDummy2; // reserved 
  44. public ushort wReserved; // not currently used 
  45. public ushort XonLim; // transmit XON threshold 
  46. public ushort XoffLim; // transmit XOFF threshold 
  47. public byte ByteSize; // number of bits/byte, 4-8 
  48. public byte Parity; // 0-4=no,odd,even,mark,space 
  49. public byte StopBits; // 0,1,2 = 1, 1.5, 2 
  50. public char XonChar; // Tx and Rx XON character 
  51. public char XoffChar; // Tx and Rx XOFF character 
  52. public char ErrorChar; // error replacement character 
  53. public char EofChar; // end of input character 
  54. public char EvtChar; // received event character 
  55. public ushort wReserved1; // reserved; do not use 
  56. [StructLayout(LayoutKind.Sequential)] 
  57. private struct COMMTIMEOUTS 
  58. public int ReadIntervalTimeout; 
  59. public int ReadTotalTimeoutMultiplier; 
  60. public int ReadTotalTimeoutConstant; 
  61. public int WriteTotalTimeoutMultiplier; 
  62. public int WriteTotalTimeoutConstant; 
  63. [StructLayout(LayoutKind.Sequential)] 
  64. private struct OVERLAPPED 
  65. public int Internal; 
  66. public int InternalHigh; 
  67. public int Offset; 
  68. public int OffsetHigh; 
  69. public int hEvent; 
  70. [StructLayout(LayoutKind.Sequential)] 
  71. private struct COMSTAT 
  72. /*public int fCtsHold; 
  73. public int fDsrHold; 
  74. public int fRlsdHold; 
  75. public int fXoffHold; 
  76. public int fXoffSent; 
  77. public int fEof; 
  78. public int fTxim; 
  79. public int fReserved; 
  80. public int cbInQue; 
  81. public int cbOutQue;*/ 
  82. // Should have a reverse, i don't know why!!!!! 
  83. public int cbOutQue; 
  84. public int cbInQue; 
  85. public int fReserved; 
  86. public int fTxim; 
  87. public int fEof; 
  88. public int fXoffSent; 
  89. public int fXoffHold; 
  90. public int fRlsdHold; 
  91. public int fDsrHold; 
  92. public int fCtsHold; 
  93. #if FULLFRAMEWORK 
  94. [DllImport("kernel32")] 
  95. private static extern int CreateFile( 
  96. string lpFileName, // file name 
  97. uint dwDesiredAccess, // access mode 
  98. int dwShareMode, // share mode 
  99. int lpSecurityAttributes, // SD 
  100. int dwCreationDisposition, // how to create 
  101. int dwFlagsAndAttributes, // file attributes 
  102. int hTemplateFile // handle to template file 
  103. ); 
  104. #else 
  105. [DllImport("coredll")] 
  106. private static extern int CreateFile( 
  107. string lpFileName, // file name 
  108. uint dwDesiredAccess, // access mode 
  109. int dwShareMode, // share mode 
  110. int lpSecurityAttributes, // SD 
  111. int dwCreationDisposition, // how to create 
  112. int dwFlagsAndAttributes, // file attributes 
  113. int hTemplateFile // handle to template file 
  114. ); 
  115. #endif 
  116. #if FULLFRAMEWORK 
  117. [DllImport("kernel32")] 
  118. private static extern bool GetCommState( 
  119. int hFile, // handle to communications device 
  120. ref DCB lpDCB // device-control block 
  121. ); 
  122. #else 
  123. [DllImport("coredll")] 
  124. private static extern bool GetCommState( 
  125. int hFile, // handle to communications device 
  126. ref DCB lpDCB // device-control block 
  127. ); 
  128. #endif 
  129. #if FULLFRAMEWORK 
  130. [DllImport("kernel32")] 
  131. private static extern bool BuildCommDCB( 
  132. string lpDef, // device-control string 
  133. ref DCB lpDCB // device-control block 
  134. ); 
  135. #else 
  136. [DllImport("coredll")] 
  137. private static extern bool BuildCommDCB( 
  138. string lpDef, // device-control string 
  139. ref DCB lpDCB // device-control block 
  140. ); 
  141. #endif 
  142. #if FULLFRAMEWORK 
  143. [DllImport("kernel32")] 
  144. private static extern bool SetCommState( 
  145. int hFile, // handle to communications device 
  146. ref DCB lpDCB // device-control block 
  147. ); 
  148. #else 
  149. [DllImport("coredll")] 
  150. private static extern bool SetCommState( 
  151. int hFile, // handle to communications device 
  152. ref DCB lpDCB // device-control block 
  153. ); 
  154. #endif 
  155. #if FULLFRAMEWORK 
  156. [DllImport("kernel32")] 
  157. private static extern bool GetCommTimeouts( 
  158. int hFile, // handle to comm device 
  159. ref COMMTIMEOUTS lpCommTimeouts // time-out values 
  160. ); 
  161. #else 
  162. [DllImport("coredll")] 
  163. private static extern bool GetCommTimeouts( 
  164. int hFile, // handle to comm device 
  165. ref COMMTIMEOUTS lpCommTimeouts // time-out values 
  166. ); 
  167. #endif 
  168. #if FULLFRAMEWORK 
  169. [DllImport("kernel32")] 
  170. private static extern bool SetCommTimeouts( 
  171. int hFile, // handle to comm device 
  172. ref COMMTIMEOUTS lpCommTimeouts // time-out values 
  173. ); 
  174. #else 
  175. [DllImport("coredll")] 
  176. private static extern bool SetCommTimeouts( 
  177. int hFile, // handle to comm device 
  178. ref COMMTIMEOUTS lpCommTimeouts // time-out values 
  179. ); 
  180. #endif 
  181. #if FULLFRAMEWORK 
  182. [DllImport("kernel32")] 
  183. private static extern bool ReadFile( 
  184. int hFile, // handle to file 
  185. byte[] lpBuffer, // data buffer 
  186. int nNumberOfBytesToRead, // number of bytes to read 
  187. ref int lpNumberOfBytesRead, // number of bytes read 
  188. ref OVERLAPPED lpOverlapped // overlapped buffer 
  189. ); 
  190. #else 
  191. [DllImport("coredll")] 
  192. private static extern bool ReadFile( 
  193. int hFile, // handle to file 
  194. byte[] lpBuffer, // data buffer 
  195. int nNumberOfBytesToRead, // number of bytes to read 
  196. ref int lpNumberOfBytesRead, // number of bytes read 
  197. ref OVERLAPPED lpOverlapped // overlapped buffer 
  198. ); 
  199. #endif 
  200. #if FULLFRAMEWORK 
  201. [DllImport("kernel32")] 
  202. private static extern bool WriteFile( 
  203. int hFile, // handle to file 
  204. byte[] lpBuffer, // data buffer 
  205. int nNumberOfBytesToWrite, // number of bytes to write 
  206. ref int lpNumberOfBytesWritten, // number of bytes written 
  207. ref OVERLAPPED lpOverlapped // overlapped buffer 
  208. ); 
  209. #else 
  210. [DllImport("coredll")] 
  211. private static extern bool WriteFile( 
  212. int hFile, // handle to file 
  213. byte[] lpBuffer, // data buffer 
  214. int nNumberOfBytesToWrite, // number of bytes to write 
  215. ref int lpNumberOfBytesWritten, // number of bytes written 
  216. ref OVERLAPPED lpOverlapped // overlapped buffer 
  217. ); 
  218. #endif 
  219. #if FULLFRAMEWORK 
  220. [DllImport("kernel32")] 
  221. private static extern bool CloseHandle( 
  222. int hObject // handle to object 
  223. ); 
  224. #else 
  225. [DllImport("coredll")] 
  226. private static extern bool CloseHandle( 
  227. int hObject // handle to object 
  228. ); 
  229. #endif 
  230. #if FULLFRAMEWORK 
  231. [DllImport("kernel32")] 
  232. private static extern bool ClearCommError( 
  233. int hFile, // handle to file 
  234. ref int lpErrors, 
  235. ref COMSTAT lpStat 
  236. ); 
  237. #else 
  238. [DllImport("coredll")] 
  239. private static extern bool ClearCommError( 
  240. int hFile, // handle to file 
  241. ref int lpErrors, 
  242. ref COMSTAT lpStat 
  243. ); 
  244. #endif 
  245. #if FULLFRAMEWORK 
  246. [DllImport("kernel32")] 
  247. private static extern bool PurgeComm( 
  248. int hFile, // handle to file 
  249. uint dwFlags 
  250. ); 
  251. #else 
  252. [DllImport("coredll")] 
  253. private static extern bool PurgeComm( 
  254. int hFile, // handle to file 
  255. uint dwFlags 
  256. ); 
  257. #endif 
  258. #if FULLFRAMEWORK 
  259. [DllImport("kernel32")] 
  260. private static extern bool SetupComm( 
  261. int hFile, 
  262. int dwInQueue, 
  263. int dwOutQueue 
  264. ); 
  265. #else 
  266. [DllImport("coredll")] 
  267. private static extern bool SetupComm( 
  268. int hFile, 
  269. int dwInQueue, 
  270. int dwOutQueue 
  271. ); 
  272. #endif 
  273. #endregion 
  274. // SerialPort的成员变量 
  275. private int hComm = INVALID_HANDLE_VALUE; 
  276. private bool bOpened = false; 
  277. public bool Opened 
  278. get 
  279. return bOpened; 
  280. /// <summary> 
  281. ///串口的初始化函数 
  282. ///lpFileName 端口名 
  283. ///baudRate 波特率 
  284. ///parity 校验位 
  285. ///byteSize 数据位 
  286. ///stopBits 停止位 
  287. /// <summary> 
  288. public bool OpenPort(string lpFileName,int baudRate,byte parity, byte byteSize, byte stopBits) 
  289. // OPEN THE COMM PORT. 
  290. hComm = CreateFile(lpFileName ,GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_EXISTING, 0, 0); 
  291. // IF THE PORT CANNOT BE OPENED, BAIL OUT. 
  292. if(hComm == INVALID_HANDLE_VALUE) 
  293. return false; 
  294. SetupComm(hComm, MAXBLOCK, MAXBLOCK); 
  295. // SET THE COMM TIMEOUTS. 
  296. COMMTIMEOUTS ctoCommPort = new COMMTIMEOUTS(); 
  297. GetCommTimeouts(hComm,ref ctoCommPort); 
  298. ctoCommPort.ReadIntervalTimeout = Int32.MaxValue; 
  299. ctoCommPort.ReadTotalTimeoutConstant = 0; 
  300. ctoCommPort.ReadTotalTimeoutMultiplier = 0; 
  301. ctoCommPort.WriteTotalTimeoutMultiplier = 10; 
  302. ctoCommPort.WriteTotalTimeoutConstant = 1000; 
  303. SetCommTimeouts(hComm,ref ctoCommPort); 
  304. // SET BAUD RATE, PARITY, WORD SIZE, AND STOP BITS. 
  305. // THERE ARE OTHER WAYS OF DOING SETTING THESE BUT THIS IS THE EASIEST. 
  306. // IF YOU WANT TO LATER ADD CODE FOR OTHER BAUD RATES, REMEMBER 
  307. // THAT THE ARGUMENT FOR BuildCommDCB MUST BE A POINTER TO A STRING. 
  308. // ALSO NOTE THAT BuildCommDCB() DEFAULTS TO NO HANDSHAKING. 
  309. DCB dcbCommPort = new DCB(); 
  310. dcbCommPort.DCBlength = Marshal.SizeOf(dcbCommPort); 
  311. GetCommState(hComm, ref dcbCommPort); 
  312. dcbCommPort.BaudRate = baudRate; 
  313. dcbCommPort.Parity = parity; 
  314. dcbCommPort.ByteSize = byteSize; 
  315. dcbCommPort.StopBits = stopBits; 
  316. SetCommState(hComm, ref dcbCommPort); 
  317. PurgeComm(hComm, PURGE_RXCLEAR | PURGE_RXABORT); 
  318. PurgeComm(hComm, PURGE_TXCLEAR | PURGE_TXABORT); 
  319. bOpened = true; 
  320. return true; 
  321. // 关闭串口 
  322. public bool ClosePort() 
  323. if (hComm == INVALID_HANDLE_VALUE) 
  324. return false; 
  325. if (CloseHandle(hComm)) 
  326. hComm = INVALID_HANDLE_VALUE; 
  327. bOpened = false; 
  328. return true; 
  329. else 
  330. return false; 
  331. // 往串口写数据 
  332. public bool WritePort(byte[] WriteBytes) 
  333. if (hComm == INVALID_HANDLE_VALUE) 
  334. return false; 
  335. COMSTAT ComStat = new COMSTAT(); 
  336. int dwErrorFlags = 0; 
  337. ClearCommError(hComm, ref dwErrorFlags, ref ComStat); 
  338. if (dwErrorFlags != 0) 
  339. PurgeComm(hComm, PURGE_TXCLEAR | PURGE_TXABORT); 
  340. OVERLAPPED ovlCommPort = new OVERLAPPED(); 
  341. int BytesWritten = 0; 
  342. return WriteFile(hComm, WriteBytes, WriteBytes.Length, ref BytesWritten, ref ovlCommPort); 
  343. // 从串口读数据 
  344. public int ReadPort(int NumBytes, byte[] commRead) 
  345. if (hComm == INVALID_HANDLE_VALUE) 
  346. return 0; 
  347. COMSTAT ComStat = new COMSTAT(); 
  348. int dwErrorFlags = 0; 
  349. ClearCommError(hComm, ref dwErrorFlags, ref ComStat); 
  350. if (dwErrorFlags != 0) 
  351. {
  352. PurgeComm(hComm, PURGE_RXCLEAR | PURGE_RXABORT); 
  353. }
  354. if (ComStat.cbInQue > 0) 
  355. OVERLAPPED ovlCommPort = new OVERLAPPED(); 
  356. int BytesRead = 0; 
  357. ReadFile(hComm, commRead, NumBytes, ref BytesRead, ref ovlCommPort); 
  358. return BytesRead;
  359. else 
  360. return 0; 
  361. namespace SerialPortPC
  362. {
  363. /// <summary>
  364. /// Form1 的摘要说明。
  365. /// </summary>
  366. public class Form1 : System.Windows.Forms.Form
  367. {
  368. private System.Windows.Forms.Label label2;
  369. private System.Windows.Forms.Label label1;
  370. private System.Windows.Forms.TextBox textBoxSend;
  371. private System.Windows.Forms.Button button2;
  372. private System.Windows.Forms.TextBox textBoxReceive;
  373. private System.Windows.Forms.Button button1;
  374. /// <summary>
  375. /// 必需的设计器变量。
  376. /// </summary>
  377. private System.ComponentModel.Container components = null;
  378. private SerialAPI.SerialPort Serial=new SerialAPI.SerialPort();
  379. bool PortOpen=false;
  380. bool Receive=false;
  381. public Form1()
  382. {
  383. //
  384. // Windows 窗体设计器支持所必需的
  385. //
  386. InitializeComponent();
  387. //
  388. // TODO: 在 InitializeComponent 调用后添加任何构造函数代码
  389. //
  390. }
  391. /// <summary>
  392. /// 清理所有正在使用的资源。
  393. /// </summary>
  394. protected override void Dispose( bool disposing )
  395. {
  396. if( disposing )
  397. {
  398. if (components != null) 
  399. {
  400. components.Dispose();
  401. }
  402. }
  403. base.Dispose( disposing );
  404. }
  405. #region Windows 窗体设计器生成的代码
  406. /// <summary>
  407. /// 设计器支持所需的方法 - 不要使用代码编辑器修改
  408. /// 此方法的内容。
  409. /// </summary>
  410. private void InitializeComponent()
  411. {
  412. this.label2 = new System.Windows.Forms.Label();
  413. this.label1 = new System.Windows.Forms.Label();
  414. this.textBoxSend = new System.Windows.Forms.TextBox();
  415. this.button2 = new System.Windows.Forms.Button();
  416. this.textBoxReceive = new System.Windows.Forms.TextBox();
  417. this.button1 = new System.Windows.Forms.Button();
  418. this.SuspendLayout();
  419. // 
  420. // label2
  421. // 
  422. this.label2.Location = new System.Drawing.Point(48, 160);
  423. this.label2.Name = "label2";
  424. this.label2.Size = new System.Drawing.Size(64, 16);
  425. this.label2.TabIndex = 6;
  426. this.label2.Text = "发送区";
  427. // 
  428. // label1
  429. // 
  430. this.label1.Location = new System.Drawing.Point(56, 16);
  431. this.label1.Name = "label1";
  432. this.label1.Size = new System.Drawing.Size(72, 16);
  433. this.label1.TabIndex = 7;
  434. this.label1.Text = "接收区";
  435. // 
  436. // textBoxSend
  437. // 
  438. this.textBoxSend.Location = new System.Drawing.Point(48, 192);
  439. this.textBoxSend.Name = "textBoxSend";
  440. this.textBoxSend.Size = new System.Drawing.Size(192, 21);
  441. this.textBoxSend.TabIndex = 8;
  442. this.textBoxSend.Text = "c8 00 00 c8";
  443. // 
  444. // button2
  445. // 
  446. this.button2.Location = new System.Drawing.Point(48, 224);
  447. this.button2.Name = "button2";
  448. this.button2.Size = new System.Drawing.Size(72, 24);
  449. this.button2.TabIndex = 9;
  450. this.button2.Text = "打开";
  451. this.button2.Click += new System.EventHandler(this.button2_Click);
  452. // 
  453. // textBoxReceive
  454. // 
  455. this.textBoxReceive.Location = new System.Drawing.Point(51, 52);
  456. this.textBoxReceive.Multiline = true;
  457. this.textBoxReceive.Name = "textBoxReceive";
  458. this.textBoxReceive.Size = new System.Drawing.Size(192, 98);
  459. this.textBoxReceive.TabIndex = 10;
  460. this.textBoxReceive.Text = "";
  461. // 
  462. // button1
  463. // 
  464. this.button1.Location = new System.Drawing.Point(160, 224);
  465. this.button1.Name = "button1";
  466. this.button1.Size = new System.Drawing.Size(72, 24);
  467. this.button1.TabIndex = 11;
  468. this.button1.Text = "发送";
  469. this.button1.Click += new System.EventHandler(this.button1_Click);
  470. // 
  471. // Form1
  472. // 
  473. this.AutoScaleBaseSize = new System.Drawing.Size(6, 14);
  474. this.ClientSize = new System.Drawing.Size(292, 273);
  475. this.Controls.Add(this.label2);
  476. this.Controls.Add(this.label1);
  477. this.Controls.Add(this.textBoxSend);
  478. this.Controls.Add(this.button2);
  479. this.Controls.Add(this.textBoxReceive);
  480. this.Controls.Add(this.button1);
  481. this.Name = "Form1";
  482. this.Text = "Form1";
  483. this.ResumeLayout(false);
  484. }
  485. #endregion
  486. /// <summary>
  487. /// 应用程序的主入口点。
  488. /// </summary>
  489. [STAThread]
  490. static void Main() 
  491. {
  492. Application.Run(new Form1());
  493. }
  494. private void button2_Click(object sender, System.EventArgs e)
  495. {
  496. if(!PortOpen)
  497. {
  498. if(Serial.OpenPort("COM1:",9600,0,8,1))
  499. {
  500. PortOpen=true;
  501. Receive=true;
  502. ThreadPool.QueueUserWorkItem(new WaitCallback(SerialReceive),0); 
  503. button2.Text="关闭";
  504. }
  505. }
  506. else
  507. {
  508. Receive=false;
  509. Serial.ClosePort();
  510. PortOpen=false;
  511. button2.Text="打开";
  512. }
  513. }
  514. private void button1_Click(object sender, System.EventArgs e)
  515. {
  516. if(textBoxSend.TextLength==0)
  517. {
  518. return;
  519. }
  520. // byte[] buf;
  521. // buf=new byte [textBoxSend.TextLength];
  522. // for(int i=0;i<textBoxSend.TextLength;i++)
  523. // {
  524. // buf[i]=Convert.ToByte(textBoxSend.Text[i]);
  525. // }
  526. byte[] buf=new byte[4]; 
  527. buf[0]=200; 
  528. buf[1]=0;
  529. buf[2]=0;
  530. buf[3]=200;
  531. Serial.WritePort(buf);
  532. }
  533. public void SerialReceive(Object a)
  534. {
  535. byte [] buf;
  536. buf=new byte [1];
  537. int bytesRead=0;
  538. int i;
  539. while(Receive)
  540. {
  541. if(Serial.Opened)
  542. {
  543. bytesRead=Serial.ReadPort(1,buf);
  544. if(bytesRead>0)
  545. {
  546. for(i=0;i<bytesRead;i++)
  547. {
  548. textBoxReceive.Text+=Convert.ToChar(buf[i]).ToString();
  549. }
  550. }
  551. //Application.DoEvents();
  552. }
  553. }
  554. //Thread.Sleep(0);
  555. }
  556. }
  557. }