jane0418 2015-03-13 06:47 采纳率: 0%
浏览 3135

c#监听串口是怎么监听不到

图片说明
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
//添加的引用
using System.IO.Ports;
using System.Threading;
using Microsoft.Win32;

namespace JTproject
{
/*创建时间:
功能:监听串口
*创建作者:
*
*/
public partial class jianting : Form
{
public jianting()
{
InitializeComponent();
}
private SerialPort Sp = new SerialPort();
public delegate void HandleInterfaceUpdataDelegate(string text); //委托,此为重点
private HandleInterfaceUpdataDelegate interfaceUpdataHandle;
// private bool qiii = false;

    private void jianting_Load(object sender, EventArgs e)
    {
        GetComList();
        //txtcomid.Focus();
        btnPause.Enabled = false;

    }
    private void UpdateTextBox(string text)
    {
        txtData.Text = text;
    }
    //监听

    private void btnENT_Click(object sender, EventArgs e)
    {
        //if ((cmID.Text.Trim() != "") && (cmRate.Text != ""))
        if ((cmID.Text.Trim()!= "") && cmRate.Text!= "")
        {
            interfaceUpdataHandle = new HandleInterfaceUpdataDelegate(UpdateTextBox);//实例化委托对象
            Sp.PortName = cmID.Text.Trim();
            Sp.BaudRate = Convert.ToInt32(cmRate.Text.Trim());
            Sp.Parity = Parity.None;
            Sp.StopBits = StopBits.One;
            Sp.DataReceived += new SerialDataReceivedEventHandler(Sp_DataReceived);
            Sp.ReceivedBytesThreshold = 1;
            try
            {
                Sp.Open();
                ATCommand3("AT+CLIP=1\r", "OK");
               //txtcomid.ReadOnly = true;
                btnPause.Enabled = true;
                btnENT.Enabled = false;
            }
            catch
            {
                MessageBox.Show("端口" + cmID.Text.Trim() + "打开失败!");
            }
        }
        else
        {
            MessageBox.Show("请输入正确的端口号和波特率!");
            cmID.Focus();
        }

    }
    //暂停
    private void btnPause_Click(object sender, EventArgs e)
    {
        Sp.Close();
        btnENT.Enabled = true;
        btnPause.Enabled = false;

        //txtcomid.ReadOnly = false;

    }
    private void jianting_FormClosing(object sender, FormClosingEventArgs e)
    {
        Sp.Close();
    }
    //sp是串口控件
    public void Sp_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
    {
        string strTemp = "";
        double iSecond = 0.5;
        DateTime dtOld = System.DateTime.Now;
        DateTime dtNow = System.DateTime.Now;
        TimeSpan dtInter;
        dtInter = dtNow - dtOld;
        int i = Sp.BytesToRead;
        if (i > 0)
        {
            try
            {
                strTemp = Sp.ReadExisting();
            }
            catch
            { }
            if (strTemp.ToLower().IndexOf("\r") < 0)
            {
                i = 0;
            }
            else
            {
                this.Invoke(interfaceUpdataHandle, strTemp);
            }
        }
        while (dtInter.TotalSeconds < iSecond && i <= 0)
        {
            dtNow = System.DateTime.Now;
            dtInter = dtNow - dtOld;
            i = Sp.BytesToRead;
            if (i > 0)
            {
                try
                {
                    strTemp += Sp.ReadExisting();
                }
                catch
                { }
                if (strTemp.ToLower().IndexOf("\r") < 0)
                {
                    i = 0;
                }
                else
                {
                    this.Invoke(interfaceUpdataHandle, strTemp);
                }
            }
        }
        // do null
    }

    /// <summary>
    /// 执行AT指令并返回 成功失败
    /// </summary>
    /// <param name="ATCmd">AT指令</param>
    /// <param name="StCmd">AT指令标准结束标识</param>
    /// <returns></returns>
    private void ATCommand3(string ATCmd, string StCmd)
    {
        string response = "";
        response = ATCommand(ATCmd, StCmd);
    }
    /// <summary>
    /// 执行AT指令并返回结果字符
    /// </summary>
    /// <param name="ATCmd">AT指令</param>
    /// <param name="StCmd">AT指令标准结束标识</param>
    /// <returns></returns>
    private string ATCommand(string ATCmd, string StCmd)
    {
        string response = "";
        int i;
        if (!ATCmd.EndsWith("\x01a"))
        {
            if (!(ATCmd.EndsWith("\r") || ATCmd.EndsWith("\r\n")))
            {
                ATCmd = ATCmd + "\r";
            }
        }
        Sp.WriteLine(ATCmd);
        //第一次读响应数据
        if (Sp.BytesToRead > 0)
        {
            response = Sp.ReadExisting();
            //去除前端多可能多读取的字符
            if (response.IndexOf(ATCmd) > 0)
            {
                response = response.Substring(response.IndexOf(ATCmd));
            }
            else
            {
            }
            if (response == "" || response.IndexOf(StCmd) < 0)
            {
                if (response != "")
                {
                    if (response.Trim() == "ERROR")
                    {
                        //throw vError = new UnknowException("Unknown exception in sending command:" + ATCmd);
                    }
                    if (response.IndexOf("+CMS ERROR") >= 0)
                    {
                        string[] cols = new string[100];
                        cols = response.Split(';');
                        if (cols.Length > 1)
                        {
                            string errorCode = cols[1];
                        }
                    }
                }
            }
        }
        //读第一次没有读完的响应数据,直到读到特征数据或超时
        for (i = 0; i < 3; i++)
        {
            Thread.Sleep(1000);
            response = response + Sp.ReadExisting();
            if (response.IndexOf(StCmd) >= 0)
            {
                break;
            }
        }
        return response;
    }
    /// <summary>
    /// 从注册表获取系统串口列表
    /// </summary>
    private void GetComList()
    {
        RegistryKey keyCom = Registry.LocalMachine.OpenSubKey("Hardware\\DeviceMap\\SerialComm");
        if (keyCom != null)
        {
            string[] sSubKeys = keyCom.GetValueNames();

            this.cmID.Items.Clear();
            foreach (string sName in sSubKeys)
            {
                string sValue = (string)keyCom.GetValue(sName);
                this.cmID.Items.Add(sValue);
            }
        }
    }
    private void cmID_DropDown(object sender, EventArgs e)
    {
        GetComList();
    }
}

}

  • 写回答

2条回答 默认 最新

  • threenewbee 2015-03-13 09:30
    关注

    用串口调试助手检查是数据没有发出还是没有收到,是上位机的问题还是下位机的问题,检查通讯协议。

    评论

报告相同问题?

悬赏问题

  • ¥15 聚类分析或者python进行数据分析
  • ¥15 逻辑谓词和消解原理的运用
  • ¥15 三菱伺服电机按启动按钮有使能但不动作
  • ¥15 js,页面2返回页面1时定位进入的设备
  • ¥50 导入文件到网吧的电脑并且在重启之后不会被恢复
  • ¥15 (希望可以解决问题)ma和mb文件无法正常打开,打开后是空白,但是有正常内存占用,但可以在打开Maya应用程序后打开场景ma和mb格式。
  • ¥20 ML307A在使用AT命令连接EMQX平台的MQTT时被拒绝
  • ¥20 腾讯企业邮箱邮件可以恢复么
  • ¥15 有人知道怎么将自己的迁移策略布到edgecloudsim上使用吗?
  • ¥15 错误 LNK2001 无法解析的外部符号