已有57人关注
serialport1
发表在C#图书答疑 2010-07-24
是否精华
版块置顶:
老师您好:
我想用串口接收和发送数据
我把串口的2.3短接。
我想做个循环,不断地向串口发送和接收数据,就用了个for语句,总是报以下的错
总是报错:未处理unauthorizeaccessexception
          对端口COM1的访问被拒绝
我要是吧for循环去掉,程序运转正常,能发送和接收数据
请老师帮忙,看看那里的错
程序如下:
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;

namespace test
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            Control.CheckForIllegalCrossThreadCalls = false;

        }
        /// <summary>
        /// 开启接收数据线程
        /// </summary>
        private void ReceiveData(SerialPort serialPort)
        {
             //可用异步接收数据线程
            Thread threadReceiveSub = new Thread(new ParameterizedThreadStart(AsyReceiveData));
            threadReceiveSub.Start(serialPort);
            
        }


        
        

        //异步读取
        private void AsyReceiveData(object serialPortobj)
        {
            SerialPort serialPort = (SerialPort)serialPortobj;
            System.Threading.Thread.Sleep(500);
            try
            {
                 //txtReceive.Text =   serialPort.ReadExisting();
                int bytes = serialPort.BytesToRead;
                byte[] combuffer = new byte[bytes];
                serialPort.Read(combuffer, 0, bytes);

                string str = BitConverter.ToString(combuffer);
                txtReceive.Text = str + txtReceive.Text;
                //字串中是否存在指定字符
                if (str.Contains("63") && str.Contains("5B"))
                {
                    textBox1.Text = "存在";
                }
                else
                {
                    textBox1.Text = "不存在";          
                }
                //查找字符串在字串中的索引
                int m = str.IndexOf("5B");
                txtSend.Text = m.ToString();

                //截取字符串的一部分
                string s1 = str.Substring(0+m, 2);
                textBox2.Text = s1;
                string s2=str.Substring(3+m,2);

                //字符串相加显示
                string s23 = s2 + s1;
                textBox3.Text = s23;
                textBox4.Text = s1 + s2;

                //获取当前年月日
                DateTime currentTime = DateTime.Now;
                string strYMD = currentTime.ToString("d");
                textBox5.Text =strYMD;

                //比较两个字符串,返回值为-1,0,1
                int result=String.Compare(s2,s1);
                textBox6.Text = result.ToString();
            }
            catch (Exception e)
            {
                MessageBox.Show(e.Message);
                //处理错误
            }
            serialPort.Close();
        }
       
        //想串口发送并接收
        private void button1_Click(object sender, EventArgs e)
        {
            for (int i = 0; i < 2; i++)
            {
                System.Threading.Thread.Sleep(1000);   //1   second
                //实例化串口对象(默认:COMM1,9600,e,8,1)            
                SerialPort serialPort1 = new SerialPort();
                //更改参数
                serialPort1.PortName = "COM1";
                serialPort1.BaudRate = 2400;
                //serialPort1.bytesize = 8;
                serialPort1.Parity = Parity.Even;
                serialPort1.StopBits = StopBits.One;
                //try { serialPort1.Open(); }
                //catch { MessageBox.Show("有错误"); }
               [font color=#FF0000] serialPort1.Open();
[/font]                int a1 = 34;
                int b1 = 91;
                int c1 = a1 + b1;

                byte[] t = new byte[5];
                t[0] = 0x10;
                t[1] = 0x5B;
                t[2] = Convert.ToByte(a1.ToString("X"), 16);
                t[3] = Convert.ToByte(c1.ToString("X"), 16);
                t[4] = 0x16;
                serialPort1.Write(t, 0, 5);

                ////////开启接收数据线程
                ReceiveData(serialPort1);
            }

        }
    }

分享到:
精彩评论 5
小科_mrkj
学分:43 LV2
2010-07-24
沙发
读者朋友:
    您好,在for循环中,每次用完SerialPort对象之后都应该关闭。
gaopeng218
学分:0 LV1
TA的每日心情
开心
2023-09-05 11:07:10
2010-07-24
板凳
老师您好:
    在FOR语句的ReceiveData(serialPort1)函数的末尾有关闭串口!而且我在for循环的最好加了一个关闭串口,程序还是不行。
小科_mrkj
学分:43 LV2
2010-07-26
地板
读者朋友:
    您好,你在for循环中插入断点,然后一步一步走一下,看看是运行到那出现错误。
gaopeng218
学分:0 LV1
TA的每日心情
开心
2023-09-05 11:07:10
2010-07-26
4L
小科老师您好:
     我插入断点之后,正常运行,我感觉是在循环后出的问题。
   我在for语句的末尾加了:
             while (serialPort1.IsOpen)
                {
                   Application.DoEvents();
                }
            现在程序好了!
 谢谢您!
小科_mrkj
学分:43 LV2
2010-07-26
5L
读者朋友:
    您好,恭喜你顺利解决问题,以后如果程序遇到问题的话,可以插入断点,然后通过断点找到出现错误的地方,以便能够针对行的解决问题。
首页上一页 1 下一页尾页 5 条记录 1/1页
手机同步功能介绍
友情提示:以下图书配套资源能够实现手机同步功能
明日微信公众号
明日之星 明日之星编程特训营
客服热线(每日9:00-17:00)
400 675 1066
mingrisoft@mingrisoft.com
吉林省明日科技有限公司Copyright ©2007-2022,mingrisoft.com, All Rights Reserved长春市北湖科技开发区盛北大街3333号长春北湖科技园项目一期A10号楼四、五层
吉ICP备10002740号-2吉公网安备22010202000132经营性网站备案信息 营业执照