如题,用断点跟踪=>继续每次都可以监视到并收到到串口发送,但是禁掉断点就不能收到串口发送信息(就是程序不会执行setr())
解决办法是在串口发送前面加个thread.sleep(10);就正常了.
什么原因想不明白,为了避免不必要的问题,特意用的form.timer,不敢想是.net4.6.1的什么bug,可能还是我写的有问题.
望各位大神指教,鉴于正常运行了,就不愿意推倒了用qt去做.....
public void setR(string XYRMaddr, int value) //value 0=off,1=on
{
//发送:%01#WCSY00011**[CR]
try
{
string outStr = "";
string sReg = XYRMaddr.Substring(0, 1);
string sAddr = XYRMaddr.Substring(1, XYRMaddr.Length - 1).PadLeft(4).Replace(" ", "0");
outStr = "%01#WCS" + sReg + sAddr.ToUpper() + value.ToString();
outStr = outStr + bcc(outStr) + "\r";
byte[] aSCIIEncodingCode = Encoding.ASCII.GetBytes(outStr);
COMM.Write(aSCIIEncodingCode, 0, aSCIIEncodingCode.Length);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "串口单点写入报错", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
private void readproduce()
{
if (listView1.Items.Count > 0)
{
int count = 0, countitem = 0;
if (listView1.InvokeRequired)
{
listView1.Invoke(new Action(() =>
{
count = Convert.ToInt32(listView1.Items[0].SubItems[3].Text);
countitem = Convert.ToInt32(listView1.Items[0].Text);
NewPutPositionInformation(listView1.Items[0].Text, listView1.Items[0].SubItems[3].Text);
}));
}
else
{
count = Convert.ToInt32(listView1.Items[0].SubItems[3].Text);
countitem = Convert.ToInt32(listView1.Items[0].Text);
NewPutPositionInformation(listView1.Items[0].Text, listView1.Items[0].SubItems[3].Text);
}
switch (countitem)
{
case 1: Thread.Sleep(10); setR("R0", 1); break;
case 2: Thread.Sleep(10); setR("R1", 1); break;
case 3: Thread.Sleep(10); setR("R2", 1); break;
case 4: Thread.Sleep(10); setR("R3", 1); break;
case 5: Thread.Sleep(10); setR("R4", 1); break;
case 6: Thread.Sleep(10); setR("R5", 1); break;
case 7: Thread.Sleep(10); setR("R6", 1); break;
}
count--;
listView1.Invoke(new Action(() => { listView1.Items[0].SubItems[3].Text = Convert.ToString(count); }));
if (count == 0)
{
listView1.Invoke(new Action(() => { listView1.Items[0].Remove(); }));
}
}
}
只想明确告诉你不要想多了 —— 通常都是自己的问题,这个模块更是n多年的成熟模块。做工业协议、游戏机等等都没这个问题,哪怕板子漏电、断电~~
没说是serialport的问题啊,是取了数据=>case 1: Thread.Sleep(10); setR("R0", 1); break; 中的setR("R0", X)没执行,前面加个Thread.Sleep(10); 就好了.
case 1: setR("R0", 1); break; //不行,有时setR("R0", 1)不执行
case 1: Thread.Sleep(10); setR("R0", 1); break;//ok了,这个是蛮奇怪的,不知道为什么
你的意思是说你有两台电脑,一台电脑通过串口发送数据,另一台接受,结果接受的电脑不能接收到发送的电脑发送的全部字节?
不是 是 case 1: Thread.Sleep(10); setR("R0", 1); break; 中的setR("R0", X)没执行,前面加个Thread.Sleep(10); 就好了.
case 1: setR("R0", 1); break; //不行,有时setR("R0", 1)不执行
case 1: Thread.Sleep(10); setR("R0", 1); break;//ok了,这个是蛮奇怪的,setR("R0", 1)每次都执行不知道为什么
@mk2003: 可不可以写一个可运行的demo发上来?
@会长: 这个网站我不知道怎么发啊 好像只能发图片 能不能给我你的邮箱啊,我的是570711700@qq.com
@mk2003: zzy_0471@163.com
@会长:
收件人 投递状态 时间
zzy_0471@163.com
邮件内容未能通过收件方的“安检”,对方服务器拒收,正在进行第7053次重投。
2018年10月29日(星期一) 上午10:57
你拒收了
@mk2003: ........
那发qq邮箱吧:359177772@qq.com
@会长: 已发送成功
@mk2003: 没收到,你到底发了什么反动内容?手动笑
@会长: 两个邮箱都已发送成功了啊
@mk2003: 收到了,不过运行不起来,我这里没有你那里连接串口的设备
@mk2003: 我建议是把逻辑代码都去掉,只留下能够展现出问题的demo。可能你在写demo的过程中就已经找到答案了
@会长: 是啊 公司生产部让我帮忙写个流程控制之类的东西,连的是松下plc,我看它通讯协议写的.
这个也不存在线程互斥问题,因为form计时器线程就在ui线程,并且方法执行也是同步的.你看能不能用虚拟串口模拟下执行.
好吧,希望我有空
@会长: 哈哈 多谢了,不过原因我猜是两个串口发送的间隔时间太短 我记得测试时间是小于1ms的,但这个解释太牵强了,毕竟串口的write也是非常快的.
@会长: 问题原因网上有 就是间隔时间太短了.见链接
https://blog.csdn.net/chenlunju/article/details/7044239
问题原因网上有 就是间隔时间太短了.见链接
https://blog.csdn.net/chenlunju/article/details/7044239
除非是建立在已经大于缓冲区。
最大流速自己可以根据波特率计算。