http://www.sufeinet.com/plugin.php?id=keke_group

苏飞论坛

 找回密码
 马上注册

QQ登录

只需一步,快速开始

分布式系统框架(V2.0) 轻松承载百亿数据,千万流量!讨论专区 - 源码下载 - 官方教程

HttpHelper爬虫框架(V2.7-含.netcore) HttpHelper官方出品,爬虫框架讨论区 - 源码下载 - 在线测试和代码生成

HttpHelper爬虫类(V2.0) 开源的爬虫类,支持多种模式和属性 源码 - 代码生成器 - 讨论区 - 教程- 例子

楼主: 枯叶化蝶

[其他] C#控件combobox的addrange方法调用怎么无效啊

[复制链接]
 楼主| 发表于 2013-3-18 14:44:29 | 显示全部楼层
站长苏飞 发表于 2013-3-18 14:39
那说明不是绑定的问题,是你根本就没有取到数据,你检查下取数据那部分吧

int n = comm.BytesToRead;//先记录下来,避免某种原因,人为的原因,操作几次之间时间长,缓存不一致   
            byte[] buf = new byte[n];//声明一个临时数组存储当前来的串口数据   
            received_count += n;//增加接收计数   
            comm.Read(buf, 0, n);//读取缓冲数据   
            builder.Length=0;//清除字符串构造器的内容   
取数据是这样的。不过我的问题是,exe运行后,下拉列表中应该有电脑中的串口名啊,实际上运行以后没有下拉列表中没有串口。。。收发数据就都没实现了


1. 开通SVIP会员,免费下载本站所有源码,不限次数据,不限时间
2. 加官方QQ群,加官方微信群获取更多资源和帮助
3. 找站长苏飞做网站、商城、CRM、小程序、App、爬虫相关、项目外包等点这里
发表于 2013-3-18 14:46:47 | 显示全部楼层
枯叶化蝶 发表于 2013-3-18 14:44
int n = comm.BytesToRead;//先记录下来,避免某种原因,人为的原因,操作几次之间时间长,缓存不一致    ...

串口名是怎么取到的,看看取的时候有没有取到,打个断点一看就知道了, 光看代码我也不清楚怎么回事
 楼主| 发表于 2013-3-18 14:53:52 | 显示全部楼层
站长苏飞 发表于 2013-3-18 14:46
串口名是怎么取到的,看看取的时候有没有取到,打个断点一看就知道了, 光看代码我也不清楚怎么回事

serialport.getportname()不是读取电脑的串口吗?哈哈,越来越晕了
 楼主| 发表于 2013-3-18 14:56:14 | 显示全部楼层
站长苏飞 发表于 2013-3-18 14:46
串口名是怎么取到的,看看取的时候有没有取到,打个断点一看就知道了, 光看代码我也不清楚怎么回事

再通过combobox。item。addrange加入下拉表啊,不对吗
 楼主| 发表于 2013-3-18 14:57:21 | 显示全部楼层
站长苏飞 发表于 2013-3-18 14:46
串口名是怎么取到的,看看取的时候有没有取到,打个断点一看就知道了, 光看代码我也不清楚怎么回事

我的这个就是个简单的串口收发数据程序
发表于 2013-3-18 14:59:16 | 显示全部楼层
枯叶化蝶 发表于 2013-3-18 14:57
我的这个就是个简单的串口收发数据程序

是不假,要不你把代码传上来吧,就这一部分就行,我帮你看看
 楼主| 发表于 2013-3-18 15:04:04 | 显示全部楼层
麻烦飞哥

WindowsFormsApplication3.zip

46.15 KB, 下载次数: 45, 下载积分: 金钱 -1

发表于 2013-3-18 15:11:33 | 显示全部楼层
枯叶化蝶 发表于 2013-3-18 15:04
麻烦飞哥

你没有让窗体加载这个事件,加上这和句就行了
[code=csharp]   this.Load += new System.EventHandler(this.Form1_Load);[/code]
加在这里
QQ截图20130318151009.jpg [code=csharp]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.Text.RegularExpressions;

namespace WindowsFormsApplication3
{
    public partial class Form1 : Form
    {   
        private SerialPort comm = new SerialPort();  
        private StringBuilder builder = new StringBuilder();//避免在事件处理方法中反复的创建,定义到外面。   
        private long received_count = 0;//接收计数   
        private long send_count = 0;//发送计数
        public Form1()
        {
            InitializeComponent();
        }
        //窗体初始化   
        private void Form1_Load(object sender, EventArgs e)  
        {  
            //初始化下拉串口名称列表框   
            string[] ports = SerialPort.GetPortNames();  
            Array.Sort(ports);  
            comboPortName.Items.AddRange(ports);  
            comboPortName.SelectedIndex = comboPortName.Items.Count > 0 ? 0 : -1;  
            comboBaudrate.SelectedIndex = comboBaudrate.Items.IndexOf("9600");  
            //初始化SerialPort对象   
            comm.NewLine = "/r/n";  
            comm.RtsEnable = true;//根据实际情况吧。   
            //添加事件注册   
            comm.DataReceived += comm_DataReceived;  
        }  
        void comm_DataReceived(object sender, SerialDataReceivedEventArgs e)  
        {  
            int n = comm.BytesToRead;//先记录下来,避免某种原因,人为的原因,操作几次之间时间长,缓存不一致   
            byte[] buf = new byte[n];//声明一个临时数组存储当前来的串口数据   
            received_count += n;//增加接收计数   
            comm.Read(buf, 0, n);//读取缓冲数据   
            //builder.Clear();//清除字符串构造器的内容   
            //因为要访问ui资源,所以需要使用invoke方式同步ui。   
            this.Invoke((EventHandler)(delegate  
            {
                //判断是否是显示为16进制
                if (checkBoxHexView.Checked)  
                {  
                    //依次的拼接出16进制字符串   
                    foreach (byte b in buf)  
                    {  
                        builder.Append(b.ToString("X2") + " ");  
                    }  
                }  
                else  
                {  

                    //直接按ASCII规则转换成字符串   
                    builder.Append(Encoding.ASCII.GetString(buf));  
                }  
                //追加的形式添加到文本框末端,并滚动到最后。   
                this.txGet.AppendText(builder.ToString());  
                //修改接收计数   
                labelGetCount.Text = "Get:" + received_count.ToString();  
            }));  
        }  
        private void buttonOpenClose_Click(object sender, EventArgs e)  
        {  
            //根据当前串口对象,来判断操作   
            if (comm.IsOpen)  
            {  
                //打开时点击,则关闭串口   
                comm.Close();  
            }  
            else  
            {  
                //关闭时点击,则设置好端口,波特率后打开   
                comm.PortName = comboPortName.Text;  
                comm.BaudRate = int.Parse(comboBaudrate.Text);  
                try  
                {  
                    comm.Open();  
                }  
                catch(Exception ex)  
                {  
                    //捕获到异常信息,创建一个新的comm对象,之前的不能用了。   
                    comm = new SerialPort();  
                    //现实异常信息给客户。   
                    MessageBox.Show(ex.Message);  
                }  
            }  
            //设置按钮的状态   
            buttonOpenClose.Text = comm.IsOpen ? "Close" : "Open";  
            buttonSend.Enabled = comm.IsOpen;  
        }  
        //动态的修改获取文本框是否支持自动换行。   
        private void checkBoxNewlineGet_CheckedChanged(object sender, EventArgs e)  
        {  
            txGet.WordWrap = checkBoxNewlineGet.Checked;  
        }  
        private void buttonSend_Click(object sender, EventArgs e)  
        {  
            //定义一个变量,记录发送了几个字节   
            int n = 0;  
            //16进制发送   
            if (checkBoxHexSend.Checked)  
            {  
                //我们不管规则了。如果写错了一些,我们允许的,只用正则得到有效的十六进制数   
                MatchCollection mc = Regex.Matches(txSend.Text, @"(?i)[/da-f]{2}");  
                List<byte> buf = new List<byte>();//填充到这个临时列表中   
                //依次添加到列表中   
                foreach (Match m in mc)  
                {  
                    buf.Add(byte.Parse(m.Value));  
                }  
                //转换列表为数组后发送   
                comm.Write(buf.ToArray(), 0, buf.Count);  
                //记录发送的字节数   
                n = buf.Count;  
            }  
            else//ascii编码直接发送   
            {  
                //包含换行符   
                if (checkBoxNewlineSend.Checked)  
                {  
                    comm.WriteLine(txSend.Text);  
                    n = txSend.Text.Length + 2;  
                }  
                else//不包含换行符   
                {  
                    comm.Write(txSend.Text);  
                    n = txSend.Text.Length;  
                }  
            }  
            send_count += n;//累加发送字节数   
            labelSendCount.Text = "Send:" + send_count.ToString();//更新界面   
        }
        private void buttonReset_Click(object sender, EventArgs e)
        {
            //复位接受和发送的字节数计数器并更新界面。   
            send_count = received_count = 0;
            labelGetCount.Text = "Get:0";
            labelSendCount.Text = "Send:0";
        }
    }
}
[/code]
然后你再运行看看如下
QQ截图20130318151018.jpg
如果问题解决了请将状态修改为已解决
代码如下

 楼主| 发表于 2013-3-18 15:14:34 | 显示全部楼层
designer代码不是自动生成的吗?这个也要修改啊?是不是以后编程都要改呢?
发表于 2013-3-18 15:21:14 | 显示全部楼层
枯叶化蝶 发表于 2013-3-18 15:14
designer代码不是自动生成的吗?这个也要修改啊?是不是以后编程都要改呢?

是自动生成的,但是你的好些写的不对,你的事件应该是从其它地方复制过来的吧,或者是中间操作什么别的东西了,导致这种情况,一般是正常生成 的
您需要登录后才可以回帖 登录 | 马上注册

本版积分规则

QQ|手机版|小黑屋|手机版|联系我们|关于我们|广告合作|苏飞论坛 ( 豫ICP备18043678号-2)

GMT+8, 2024-11-22 08:12

© 2014-2021

快速回复 返回顶部 返回列表