3334|2

88

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

winCE5.0下串口程序无法接收数据!, [复制链接]

winCE5.0下串口程序无法接收数据!,请高手帮忙!! SOS...
下面是我在VS2005下用C#编写的,用在winCE5.0下的一个串口程序,在编译时出现了以下错误:
——“System.Windows.Form.Form”并不包含“CheckForIllegalCrossThreadCalls”的定义——如果去掉这句话“Form.CheckForIllegalCrossThreadCalls = false;” 编译可以成功,可以发送字符串,但是不能接收,会出现这样的提示"Control.Invoke必须用于与在独立线程上创建的控件交互"!请问哪位高手可以帮一下我吗?实在没办法了!!!SOS。。。。。。


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.IO.Ports;
using System.Threading;

namespace TestSerialPort
{
    public partial class frmTESTSerialPort : Form
    {
        //实例化串口对象(默认:COM1,9600,e,8,1)                          
        SerialPort myserialPort = new SerialPort();

        //串口控件初始化
        public frmTESTSerialPort()
        {
          Form.CheckForIllegalCrossThreadCalls = false;
            InitializeComponent();
        }

        //窗口载入
        private void frmTESTSerialPort_Load(object sender, EventArgs e)
        {
            //更改参数
            myserialPort.PortName = "COM1 ";
            myserialPort.BaudRate = 9600;
            myserialPort.Parity = Parity.None;
            myserialPort.DataBits = 8;
            myserialPort.StopBits = StopBits.One;
            myserialPort.ReadBufferSize = 4096;
            //上述步骤可以用在实例化时调用SerialPort类的重载构造函数
            //SerialPort serialPort = new SerialPort("COM1 ", 9600, Parity.None, StopBits.One);  
        }

        //开启串口
        private void button1_Click(object sender, EventArgs e)
        {
            //打开串口(打开串口后不能修改端口名,波特率等参数,修改参数要在串口关闭后修改)  
            if (myserialPort.IsOpen == false)
            {
                myserialPort.Open();
                MessageBox.Show("串口开启成功");
            }
        }

        //发送数据
        private void button2_Click(object sender, EventArgs e)
        {
            //发送数据
            SendStringData(myserialPort);
        }

        //发送字符串数据
        private void SendStringData(SerialPort serialPort)
        {
            try
            {
                serialPort.Write(txtSend.Text);
            }
            catch
            {
                MessageBox.Show("请先打开串口");
            }
        }

        //发送二进制数据
        private void SendBytesData(SerialPort serialPort)
        {
            byte[] bytesSend = System.Text.Encoding.Default.GetBytes(txtSend.Text);
            serialPort.Write(bytesSend, 0, bytesSend.Length);
        }

        //接收\读取数据
        public void button3_Click(object sender, EventArgs e)
        {
            //同步阻塞接收数据线程
            Thread threadReceive = new Thread(new ThreadStart(SynReceiveData));//修改
            threadReceive.Start();
            //也可用异步接收数据线程
            //Thread  threadReceiveSub  =  new  Thread(new  ParameterizedThreadStart(AsyReceiveData));  
            //threadReceiveSub.Start(serialPort);  
        }

        //同步阻塞读取
        private  void SynReceiveData()
        {
            MessageBox.Show("同步阻塞读取线程启动");
            SerialPort serialPort = myserialPort;
            System.Threading.Thread.Sleep(0);
            try
            {
                //阻塞到读取数据或超时(这里为秒)
                serialPort.ReadTimeout = 6000;
                //下面代码要用同步的方式readtimeout起作用
                byte[] bufReceive=new byte[1024];
                int bytesRead = serialPort.Read(bufReceive, 0, bufReceive.Length);


                byte[] bytesData = new byte[bytesRead];
                for (int i = 0; i <= bytesRead - 1; i++)
                {
                    bytesData = bufReceive;
                }
              txtReceive.Text  =txtReceive.Text  + System.Text.Encoding.Default.GetString(bytesData, 0, bytesRead);
            }
            catch (Exception e)
            {
                MessageBox.Show(e.Message);
                //处理超时错误
            }
        }

        //异步读取
        private void AsyReceiveData(object serialPortobj)
        {
            SerialPort serialPort = (SerialPort)serialPortobj;
            System.Threading.Thread.Sleep(500);
            try
            {
                txtReceive.Text = txtReceive.Text + serialPort.ReadExisting();
            }
            catch (Exception e)
            {
                MessageBox.Show(e.Message);
                //处理错误
            }
        }

        private void button4_Click(object sender, EventArgs e)
        {
            if (myserialPort.IsOpen == true)
            {
                myserialPort.Close();
                MessageBox.Show("串口关闭成功");
            }
        }

        private void textBox2_TextChanged(object sender, EventArgs e)
        {

        }

        private void txtSend_TextChanged(object sender, EventArgs e)
        {

        }

        private void txtReceive_TextChanged(object sender, EventArgs e)
        {

        }

    }
  
}


这个程序可以实现在windows XP上的串口通信,能发送字符串也能接收字符串。但是我把它转换成winCE5.0的程序,编译时出现了这样的错误:
——“System.Windows.Form.Form”并不包含“CheckForIllegalCrossThreadCalls”的定义——
如果去掉这句话“Form.CheckForIllegalCrossThreadCalls = false;”,编译可以成功,可以发送字符串,但是不能接收, 会出现这样的提示"Control.Invoke必须用于与在独立线程上创建的控件交互"!请问哪位高手可以帮一下我吗?实在没办法了!!!SOS。。。。。。

问题补充:
        这个程序不是小弟本人写的,我对这个程序还不是很懂,请各位帮忙把解决方案写得稍祥细一些,谢谢了!!
此帖出自WindowsCE论坛

最新回复

请楼上的大哥再指点一下   详情 回复 发表于 2008-6-30 23:47
点赞 关注
 

回复
举报

60

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
CheckForIllegalCrossThreadCalls在CE下不能用吧,你可以换成替代的API试试阿
此帖出自WindowsCE论坛
 
 
 

回复

77

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
请楼上的大哥再指点一下
此帖出自WindowsCE论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表