none
c#操作串口 问题 RRS feed

  • 问题

  • 最近研究了下C#操作串口的方法,在网上看了些源代码,多数都是通过[DllImport("kernel32.dll")]
            private static extern bool WriteFile(
       int hFile,                    // handle to file
       byte[] lpBuffer,                // data buffer
       int nNumberOfBytesToWrite,     // number of bytes to write
       ref int lpNumberOfBytesWritten,  // number of bytes written
       ref OVERLAPPED lpOverlapped        // overlapped buffer
       );
    这个方法完成通信。我想请问下,这个函数怎么就能决定是用串口还是要真的创建文件呢?我看了下这个函数第一个需要传入的参数是通过 CreateFile创建的private static extern int CreateFile(
       string lpFileName,                         // file name
       uint dwDesiredAccess,                      // access mode
       int dwShareMode,                          // share mode
       int lpSecurityAttributes, // SD
       int dwCreationDisposition,                // how to create
       int dwFlagsAndAttributes,                 // file attributes
       int hTemplateFile                        // handle to template file
       );
    这两个函数有人能给解释下么?主要是从实际原理上说下。
    • 已编辑 三丰 2009年10月29日 9:23 添加新说明
    2009年10月29日 9:09

答案

  • 你看看这个行不:这个也是用的 serialPort1!如不明白那你在看看这个网页:http://hi.baidu.com/freezesoul/blog/item/1244b0de4a18c45bccbf1a8f.html
    (1)新建一个项目,命名为Ex13_01,默认窗体为Form1。

    (2)在Form1窗体中,主要添加两个Button控件,分别用于执行发送数据和接受数据,添加两个TextBox控件,用于输入发送数据和显示接收数据。

    (3)主要程序代码。

             private void button1_Click(object sender, EventArgs e)

             {

                 serialPort1.PortName = "COM1";

                 serialPort1.BaudRate = 9600;

                 serialPort1.Open();

                 byte[] data = Encoding.Unicode.GetBytes(textBox1.Text);

                 string str = Convert.ToBase64String(data);

                 serialPort1.WriteLine(str);

                 MessageBox.Show("数据发送成功!","系统提示");

             }

             private void button2_Click(object sender, EventArgs e)

             {

                 byte[] data = Convert.FromBase64String(serialPort1.ReadLine());

                 textBox2.Text = Encoding.Unicode.GetString(data);

                 serialPort1.Close();

                 MessageBox.Show("数据接收成功!","系统提示");

             }

    • 已标记为答案 三丰 2009年11月3日 5:38
    2009年11月2日 2:19

全部回复

  • 你好!
         如果没有特殊需要,不用使用API,可以直接使用SerialPort类,具体可以参考:
    http://msdn.microsoft.com/zh-cn/library/system.io.ports.serialport(VS.80).aspx
    周雪峰
    2009年10月29日 11:57
    版主
  • SerialPort

    这个类果然好用。可这里我又有个问题,找了半天没找到好办法,只能再问下了。就是serialPort1.Open();打开串口的方法。如果我这个串口打不开,调用这个open方法就报错误了,我现在时拿try catch 捕获的。请问有专门的方法可以判断是否可以Open指定串口么?

    2009年10月29日 14:51
  • 一般用try catch就可以了!
    周雪峰
    2009年10月30日 1:33
    版主
  • 你看看这个行不:这个也是用的 serialPort1!如不明白那你在看看这个网页:http://hi.baidu.com/freezesoul/blog/item/1244b0de4a18c45bccbf1a8f.html
    (1)新建一个项目,命名为Ex13_01,默认窗体为Form1。

    (2)在Form1窗体中,主要添加两个Button控件,分别用于执行发送数据和接受数据,添加两个TextBox控件,用于输入发送数据和显示接收数据。

    (3)主要程序代码。

             private void button1_Click(object sender, EventArgs e)

             {

                 serialPort1.PortName = "COM1";

                 serialPort1.BaudRate = 9600;

                 serialPort1.Open();

                 byte[] data = Encoding.Unicode.GetBytes(textBox1.Text);

                 string str = Convert.ToBase64String(data);

                 serialPort1.WriteLine(str);

                 MessageBox.Show("数据发送成功!","系统提示");

             }

             private void button2_Click(object sender, EventArgs e)

             {

                 byte[] data = Convert.FromBase64String(serialPort1.ReadLine());

                 textBox2.Text = Encoding.Unicode.GetString(data);

                 serialPort1.Close();

                 MessageBox.Show("数据接收成功!","系统提示");

             }

    • 已标记为答案 三丰 2009年11月3日 5:38
    2009年11月2日 2:19