刚接触rabbitmq和串口通信,遇到了个问题,希望有懂的大拿可以指点一二。
开发的程序需要通过串口通信读取实时数据,然后将获取的数据处理后上传至队列,在上传数据的过程中必须要关闭串口(serial.Close()),否则代码会卡在连接服务器的过程,之后就是报错,报错信息如下:
RabbitMQ.Client.Exceptions.BrokerUnreachableException: None of the specified endpoints were reachable ---> System.IO.IOException:
connection.start was never received, likely due to a network timeout
如果在上传的步骤之前将serial提前关闭就不会出现这个问题,有时候还会出现程序卡顿假死的情况(概率很小),虽然不知道是不是这个原因导致的,但只有在给队列上传消息的时候才会遇到这个情况。
下面是我的代码:
private void Menu_Load(object sender, EventArgs e)
{
//称重读数
serial.PortName = "COM16";
serial.BaudRate = 9600;
serial.DataBits = 8;
serial.StopBits = StopBits.One;
serial.Parity = Parity.None;
serial.ReadTimeout = 100;
serial.WriteTimeout = -1;
serial.ReceivedBytesThreshold = 1;
serial.DataReceived += new SerialDataReceivedEventHandler(Serial_Received);
serial.Open();
}
//串口读数方法
private void Serial_Received(object sender, SerialDataReceivedEventArgs e)
{
try
{
SerialPort serial = (SerialPort)sender;
string strReadData = serial.ReadExisting().Substring(3);
string strWeight = null;
this.Invoke(new Action(() =>
{
for (int i = 0; i <= 16; i++)
{
if (strReadData.Substring(0, 1) == " ")
{
strReadData = strReadData.Substring(1);
}
else
{
if (i < 11)
{
strWeight = strWeight + strReadData.Substring(0, 1);
strReadData = strReadData.Substring(1);
}
}
}
txtNowWeight.Text = strWeight;
}));
}
catch
{
MessageBox.Show("程序遇到一个无法处理的未知错误,请重新启动程序!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
//上传数据的方法,在执行操作中调用
private void SendWeightData(string strNo, string strData, string strPlan, string strWeight, List<string> strPicture)
{
try
{
//因为安全问题,服务器信息都隐掉了
factory = new ConnectionFactory();
factory.HostName = "";//主机名
factory.Port = 5672;
factory.UserName = ""; //用户名
factory.Password = "";//密码
factory.AutomaticRecoveryEnabled = true;//自动的错误恢复机制
SendMessage SMessage = new SendMessage();
SMessage.NO = strNo;
SMessage.Date = strDate;
SMessage.Plan = strPlan;
SMessage.Weight = strWeight;
SMessage.Picture = strPicture;
string jsontext = JsonConvert.SerializeObject(SMessage);
//连接服务器,即正在创建终结点。
using (var connection = factory.CreateConnection())//断点调试的过程中程序就卡在这一步
{
using (var channel = connection.CreateModel())
{
var strProperties = channel.CreateBasicProperties();
channel.BasicPublish("交换机", "队列名", strProperties, Encoding.UTF8.GetBytes(jsontext)); //生产消息
}
}
}
catch
{
throw;
}
}
请懂的大拿不吝赐教,如有未阐述明白的地方请联系我补充