我的计算机连着一个modem,在超级终端中向串口输入“at”,返回“ok”,我在程序里也向达到这这样的效果,可是不行啊,输入什么指令,就从端口返回什么指令,比如说输入“at”,就返回“at”,我用的类是c#2005的SerialPort类,下面是我的代码,谁能说说怎么回事,在线等,马上给分。public partial class Form1 : Form
    {
        private SerialPort sp = null;
        public Form1()
        {
            InitializeComponent();
        }        private void button1_Click(object sender, EventArgs e)
        {
            try
            {
                sp = new SerialPort("COM1");
                sp.ReadTimeout = 5000;
                sp.Open();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }        private void button2_Click(object sender, EventArgs e)
        {
            try
            {
                sp.Write(textBox1.Text);
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }        private void button3_Click(object sender, EventArgs e)
        {
            try
            {
                /*string text=null;
                char[] buffer = new char[10];
                sp.Read(buffer,0,6);
                for (int i = 0; i < buffer.Length; i++)
                {
                    text += buffer[i];
                }
                textBox2.Text = text;*/
                
                /*string text = null; 
                char t = (char)sp.ReadChar();
                text+=t.ToString();
                while (true)
                {
                    t = (char)sp.ReadChar();
                    if (t == '\0') break;
                    else text += t.ToString();
                }
                textBox2.Text = text;*/                string text = null;
                byte[] t = new byte[20];
                char[] c = new char[20];
                sp.Read(t, 0, t.Length);
                sp.Read(t, 0, t.Length);
                c =  Encoding.ASCII.GetChars(t);
                int i;
                for (i = 0; i < c.Length; i++)
                {
                    if (c[i] == 'O' || c[i] == 'K')
                        text += c[i].ToString();
                }
                 textBox2.Text = text;
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }
    }

解决方案 »

  1.   

    private void button1_Click(object sender, EventArgs e)
    {
    try
    {
    sp = new SerialPort("COM1");
    sp.ReadTimeout = 5000;
    sp.Open();
    }
    catch (Exception ex)
    {
    MessageBox.Show(ex.Message);
    }
    }
    -------------------------------------
    感觉这个地方打开串口简单了些,波特率、停止位什么的都没设置(也可能我不了解这个类)
    我用API函数操作串口需要这样设置://打开串口
    int OpenComm(char *DeviceName)
    {
    hCom = CreateFile(DeviceName, GENERIC_READ | GENERIC_WRITE,0,NULL,OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL|FILE_FLAG_OVERLAPPED,NULL);          //创建串口,异步方式
    if (hCom == INVALID_HANDLE_VALUE)
    return -1;                    //打开串口失败
    else
    {
    SetCommMask( hCom, EV_RXCHAR|EV_TXEMPTY ); //设置串口事件
    SetupComm( hCom, 4096,4096);                            //设置读写缓冲区大小
    PurgeComm( hCom, PURGE_TXABORT | PURGE_RXABORT | PURGE_TXCLEAR | PURGE_RXCLEAR );

    memset(&Write_OS,0,sizeof(OVERLAPPED));
    memset(&Read_OS,0,sizeof(OVERLAPPED));
    memset(&OS,0,sizeof(OVERLAPPED));

    COMMTIMEOUTS comTimeOut;                                //设置超时
    comTimeOut.ReadIntervalTimeout = MAXDWORD;
    comTimeOut.ReadTotalTimeoutMultiplier = 3000;
    comTimeOut.ReadTotalTimeoutConstant = 200;
    comTimeOut.WriteTotalTimeoutMultiplier = 300;
    comTimeOut.WriteTotalTimeoutConstant = 200;
    SetCommTimeouts(hCom,&comTimeOut);


    Read_OS.Internal = 0;
    Read_OS.InternalHigh = 0;
    Read_OS.Offset = 0;
    Read_OS.OffsetHigh = 0; //设置结构

    Write_OS.Internal = 0;
    Write_OS.InternalHigh = 0;
    Write_OS.Offset = 0;
    Write_OS.OffsetHigh = 0; //设置结构 Read_OS.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
    Write_OS.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);


    DCB dcb;
    GetCommState(hCom, &dcb );                               //串口设置
    dcb.BaudRate = 9600;
    dcb.ByteSize = 8; 
    dcb.Parity = NOPARITY;
    dcb.StopBits = ONESTOPBIT;
    dcb.fBinary = TRUE;
    dcb.fParity = FALSE;
    SetCommState( hCom, &dcb );

    DWORD dwThreadId, dwThrdParam = 1;
    hReadThread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)TheardEvent, &dwThrdParam, 0, &dwThreadId);       //运行串口监视线程
    return 0;
    }
    }
      

  2.   

    private void button1_Click(object sender, EventArgs e)
    {
    try
    {
    sp = new SerialPort("COM1");
    sp.ReadTimeout = 5000;
    sp.Open();
    }
    catch (Exception ex)
    {
    MessageBox.Show(ex.Message);
    }
    }
    -------------------------------------
    楼主试了么?我没用过这个类。估计应该有:
    sp.SetBaudRate, sp.BaudRate 等设置函数或变量,用来设置波特率等,你试试看。
    我上边这一段
    DCB dcb;
    GetCommState(hCom, &dcb ); //串口设置
    dcb.BaudRate = 9600;        // 波特率9600
    dcb.ByteSize = 8;           //数据位
    dcb.Parity = NOPARITY;      //奇偶校验
    dcb.StopBits = ONESTOPBIT;   //停止位
    dcb.fBinary = TRUE;
    dcb.fParity = FALSE;
    SetCommState( hCom, &dcb );
    就是设置的。
    你用的超级终端不是也得设置这些吗?
      

  3.   

    如果有返回值,那么有可能是没有读完全。在我印象中是这样:从串口返回的值包括你发出的AT命令。也就是说,你如果发:
    AT
    返回的是:
    ATOK
    (注意:在AT和OK间有四位数据用来换行和控制光标)
    所以在处理的时候应该注意。
      

  4.   

    楼上说的不对,我单步调试程序,监视变量的情况,发现从端口读出"at\r",后面就都是"\0\0\0\0\0\0\0"了,没有你说的ok。