| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1408 人关注过本帖
标题:serialport
只看楼主 加入收藏
gaopeng218
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2010-7-24
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:3 
serialport
我想用串口接收和发送数据
我把串口的2.3短接。
我想做个循环,不断地向串口发送和接收数据,就用了个for语句,总是报以下的错
总是报错:未处理unauthorizeaccessexception
对端口COM1的访问被拒绝
我要是吧for循环去掉,程序运转正常,能发送和接收数据
请老师帮忙,看看那里的错
程序如下:
using System;
using System.Collections.Generic;
using
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using
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=(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("有错误"); }
serialPort1.Open();
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);
}

}
}
}
搜索更多相关主题的帖子: serialport 
2010-07-24 22:06
hainandgm
Rank: 6Rank: 6
等 级:侠之大者
威 望:3
帖 子:111
专家分:475
注 册:2007-6-21
收藏
得分:20 
你采用for来控制串口不断发送和接收数据,同时也在不断地打开某个串口和关闭某个串口.在for循环中,虽然你加了延时,但是种种原因,延时用完了,串口1还没关闭,再创建一个串口1并打开,就会出现问题,按你的思路,在你的代码:

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

后面加入以下代码:

while(serialPort1.IsOpen)
{
   Application.DoEvent();
}

你测试一下,还有你的"System.Threading.Thread.Sleep(1000); //1 second"这句代码就可以不用要了
2010-07-26 14:43
gaopeng218
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2010-7-24
收藏
得分:0 
成功!谢谢你,hainandgm!我也不知道怎么感谢你,不知道怎么给分,或许我也没分!这个论坛的号是我新申请的等我用熟了,有分了一定给你!
2010-07-26 16:52
hainandgm
Rank: 6Rank: 6
等 级:侠之大者
威 望:3
帖 子:111
专家分:475
注 册:2007-6-21
收藏
得分:0 
不用客气,我不在乎是否给分,每个人都有一个过程,只是希望每个人在过程中少走一些弯路
2010-07-26 17:02
快速回复:serialport
数据加载中...
 
   



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

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