| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2287 人关注过本帖
标题:c#串口通信问题
只看楼主 加入收藏
zhoufeng1988
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
来 自:北京
等 级:贵宾
威 望:27
帖 子:1432
专家分:6329
注 册:2009-5-31
收藏
得分:0 
以下是引用贾丹丹在2011-8-11 17:45:41的发言:

在窗口应用程序中,当我写入this.txtReceiveData.AppendText(this.serialPort.ReadLine())时,error list 会提醒说 'System.Windows.Forms.TextBox' does not contain a definition for 'AppendText',是不是我这不能用'AppendText'啊?

你看看你的什么版本的.NET Framework?
如果不行就,this.txtReceiveData.Text += ...就可以。
2011-08-11 17:55
贾丹丹
Rank: 2
等 级:论坛游民
帖 子:19
专家分:25
注 册:2011-7-27
收藏
得分:0 
我用了DataReceived,可是系统又提示要开辟专门的线程接收数据,这个好像很难啊,都没接触过。。大家快来帮忙啊!发愁
2011-08-12 11:25
贾丹丹
Rank: 2
等 级:论坛游民
帖 子:19
专家分:25
注 册:2011-7-27
收藏
得分:0 
zhoufeng1988你好!非常感谢你帮我解答问题,我这边是.NET Framework2,好像要求独立的线程才能进行委托操作,现在好像又要看线程的东西了,好着急啊。能加我吗QQ1105871845
2011-08-12 11:31
贾丹丹
Rank: 2
等 级:论坛游民
帖 子:19
专家分:25
注 册:2011-7-27
收藏
得分:0 
  void SP_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            int bytesCanRead=SP.BytesToRead;
            if (bytesCanRead > 0)
            {
                string s = SP.ReadExisting();
                textBox2.Text = s; ............//系统提示要用独立的线程才可以读出,这个该这么做?有人知道吗?

            }
        }
2011-08-12 11:56
贾丹丹
Rank: 2
等 级:论坛游民
帖 子:19
专家分:25
注 册:2011-7-27
收藏
得分:0 
问题已经成功解决!谢谢各位高人的积极帮助!结贴啦!哈哈
2011-08-12 14:41
zhoufeng1988
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
来 自:北京
等 级:贵宾
威 望:27
帖 子:1432
专家分:6329
注 册:2009-5-31
收藏
得分:0 
.NET里有个线程安全的机制。
默认Control.CheckForIllegalCrossThreadCalls = true。你也可以直接关闭线程安全检查。

不过更好地方式是写一个委托,用Invoke函数来执行该委托。在之前例子的基础上,我是这么改的,你可以参考参考。但请你务必
要处理好IO异常。

        
// 委托
delegate void InvokReceive(string data);

程序代码:
void serialPort_DataReceived(object sender,  e)
{
    try
    {
         if (this.serialPort.IsOpen)
         {
             // 实例化委托对象
             InvokReceive ir = new InvokReceive(ReceiveString);
             // 构建传递的参数
             Object[] args = new Object[1];
             args[0] = this.serialPort.ReadLine();
             this.Invoke(ir, args);
          }
      catch (System.Exception ex)
      {
                // Eat exception
      }
}

程序代码:
        void ReceiveString(string str)
        {
            this.txtReceiveData.AppendText(str);
        }

注册该事件,不过如果在打开串口之后注册事件,应该在关闭串口后取消事件,不然会显示重复。
程序代码:
        private void btnOpen_Click(object sender, EventArgs e)
        {
            try
            {
                this.serialPort.Open();
                if (this.serialPort.IsOpen)
                {
                    // 注册事件
                    this.serialPort.DataReceived +=new (serialPort_DataReceived);
                }

                this.btnOpen.Enabled = false;
                this.btnClose.Enabled = true;
                this.btnSend.Enabled = true;
                this.btnReceive.Enabled = true;
            }
            catch ( ex)
            {
                MessageBox.Show("打开串口失败!请检查是否已经正常连接!", "错误",
                    MessageBoxButtons.OK, MessageBoxIcon.Error);
                return;
            }
        }


你应该多多在网上找些资料~.NET已经帮我们做得很多了,不会难的。

[ 本帖最后由 zhoufeng1988 于 2011-8-12 14:45 编辑 ]
2011-08-12 14:43
zhao248723
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2009-6-20
收藏
得分:0 
仔细查阅一下msdn中关于串口发送程序的发送函数和接收函数的功能,一般writeLine要跟ReadLine()配合使用,否则就会产生阻塞使程序没有相应,你所使用的串口调试程序的发送和接受函数和你的程序可能存在阻塞问题
2011-08-18 12:11
快速回复:c#串口通信问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.054995 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved