c# 使用List的数据接收问题

kltyp00 2016-12-28 05:22:54
我用创建串口,方法如下:
List splist=new List();
SerialPort sp=new SerialPort();
sp.PortName ="COM1";
sp.BaudRate = 4800;
sp.DataBits = 8;
splist.Add(sp);
sp=new SerialPort();
sp.PortName ="COM2";
sp.BaudRate = 4800;
sp.DataBits = 8;
splist.Add(sp);

sp.DataReceived += Sp_DataReceived;

private void Sp_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
//数据接收
}
无法收到串口返回的数据。
请问:如何接收返回的数据?
...全文
369 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
by_封爱 版主 2016-12-29
  • 打赏
  • 举报
回复
多个串口同时注册了Sp_DataReceived是没问题的. 通过sender来区分是哪个串口就好了.. 收不到数据 可能是你的"串口"根本没发...代码其实就就那么几句话 没什么问题... 实例化串口(设置串口参数) 设置datarec事件 串口.open()
  • 打赏
  • 举报
回复
引用 4 楼 cb8809 的回复:
new SerialDataReceivedEventHandler(Sp_DataReceived)
你的vs版本还是05、08啊 高版本的vs简化了定义 ,这样写是没问题的 port .DataReceived += Sp_DataReceived;
  • 打赏
  • 举报
回复
你的代码正常来说根本不能通过编译。 不能通过编译,你就要按照编译器的指示来找到错误设计原因,修改错误。 有的人瞎出主意,甚至说“既然不能编译通过,那么你随便在 class 范畴申明一个 sp 变量,不就能通过编译了嘛”,这种建议就是胡乱自欺欺人的。这就会不断产生你的这种问题。 我们从不胡乱声明变量,所以我们以自己的习惯来看你的代码,容易忽略你的这种 sp 代码。
  • 打赏
  • 举报
回复
private void Sp_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            _ReceiveData = sp.ReadExisting();//_ReceiveData为接收的数据
        }
这里的 sp 是啥?
佳佳顿 2016-12-29
  • 打赏
  • 举报
回复
new SerialDataReceivedEventHandler(Sp_DataReceived)
kltyp00 2016-12-29
  • 打赏
  • 举报
回复
感谢1楼、2楼。 我的代码贴的不完整,也未能准确描述我遇到的问题。完整的代码如下:

List<SerialPort> serialports = new List<SerialPort>();
List<SerialPortParmModel> spModelList = new List<SerialPortParmModel>();

private void button1_Click(object sender, EventArgs e)
        {
            foreach(SerialPortParmModel spParm in spModelList)
            {
                SerialPort sp = new SerialPort();
                sp.PortName = spParm.PortName;
                sp.DataBits = Convert.ToInt16(spParm.DataBits);
                sp.StopBits = (StopBits)Enum.Parse(typeof(StopBits), spParm.StopBits);
                sp.Parity = (Parity)Enum.Parse(typeof(Parity), spParm.Parity);
                sp.BaudRate = Convert.ToInt16(spParm.Baudrate);                

                serialports.Add(sp);
            }
        }

private void button2_Click(object sender, EventArgs e)
        {
            foreach(SerialPort sp in serialports)
            {
                sp.Open();
                sp.DataReceived += Sp_DataReceived;
            }
        }

private void button3_Click(object sender, EventArgs e)
        {
            string _data;
            _data ="@00RR0000000141*";

            foreach (SerialPort sp in serialports)
            {
                sp.Write(_data);
            }
        }
//数据接收,问题出在此处
private void Sp_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            _ReceiveData = sp.ReadExisting();//_ReceiveData为接收的数据
        }
button1为设置串口,button2为打开串口,button3为向串口发送数据。SerialPortParmModel为串口参数,代码如下:

/// <summary>
    /// 串口设备参数
    /// </summary>
    public class FeedSerialPortParmModel
    {
        /// <summary>
        /// 串口ID
        /// </summary>
        public string ID { get; set; }

        /// <summary>
        /// 串口用户名称
        /// </summary>
        public string Name { get; set; }

        /// <summary>
        /// 串口刷新周期(毫秒)
        /// </summary>
        public string RefreshCycle { get; set; }

        /// <summary>
        /// 串口名称
        /// </summary>
        public string PortName { get; set; }

        /// <summary>
        /// 串口波特率
        /// </summary>
        public string Baudrate { get; set; }

        /// <summary>
        /// 串口校验位
        /// </summary>
        public string Parity { get; set; }

        /// <summary>
        /// 串口停止位
        /// </summary>
        public string StopBits { get; set; }

        /// <summary>
        /// 串口数据位
        /// </summary>
        public string DataBits { get; set; }  

    }
在Sp_DataReceived不能接收到数据
佳佳顿 2016-12-29
  • 打赏
  • 举报
回复
首先 委托写法不对new SerialDataReceivedEventHandler(Sp_DataReceived) 其次 List应该这么写 List<SerialPort> sp =new List<SerialPort>(); 程序这么实现也不对吧。。。
xinweilee 2016-12-28
  • 打赏
  • 举报
回复
你这种写法,com1的数据怎么能进来,com1对应串口对象你都没有订购DataReceived事件 foreach(var port in splist) { port .DataReceived += Sp_DataReceived; }

110,539

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧