嗨,亲爱的朋友:
下午好
我写了一段代码,运行后,我先点写入按钮,弹出02000200,然后我又点击确定,又弹出111940402000200EB,我再点击确定,居然软件死机,然后在com.Write(sWriteData);这里停下,弹出一个未处理的invalid Operation Exception 这是什么意思呢?为什么会弹出这样的异常?我哪里代码未处理了?那我该怎么处理呢?
请亲爱的朋友们帮忙修改下代码。
我写的源代码如下:
1 using System; 2 using System.Collections.Generic; 3 using System.ComponentModel; 4 using System.Data; 5 using System.Drawing; 6 using System.Linq; 7 using System.Text; 8 using System.Threading.Tasks; 9 using System.Windows.Forms; 10 using System.IO.Ports; 11 12 13 namespace 三菱PLC 14 { 15 public partial class Form1 : Form 16 { 17 public Form1() 18 { 19 InitializeComponent(); 20 21 } 22 23 private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e) 24 { 25 //串口初始化 26 com = new SerialPort("com5", 9600, Parity.Even, 7, StopBits.One); 27 28 if (com.IsOpen) 29 { com.Close(); } 30 com.Open(); 31 32 } 33 34 private void textBox1_TextChanged(object sender, EventArgs e) 35 { 36 37 } 38 39 40 // ASCII转字符 41 42 43 44 public static string Chr(int asciiCode) 45 { 46 if (asciiCode >= 0 && asciiCode <= 255) 47 { 48 System.Text.ASCIIEncoding asciiEncoding = new System.Text.ASCIIEncoding(); 49 byte[] byteArray = new byte[] { (byte)asciiCode }; 50 string strCharacter = asciiEncoding.GetString(byteArray); 51 return (strCharacter); 52 } 53 54 else 55 { 56 throw new Exception("ASCII Code is not valid");//ASCII 缺失 57 58 } 59 } 60 61 //字符转ASCII 62 63 64 public static int Asc(string character) 65 { 66 if (character.Length == 1) 67 { 68 69 System.Text.ASCIIEncoding asciiEncoding = new System.Text.ASCIIEncoding(); 70 int intAsciiCode = (int)asciiEncoding.GetBytes(character)[0]; 71 return (intAsciiCode); 72 73 } 74 else 75 { 76 77 throw new Exception("character is not valid"); 78 79 } 80 81 82 } 83 84 85 86 87 88 // 写入串口的命令字符的和校验 89 90 public string SumCheck(string data) 91 { 92 int sum = 0; 93 94 for (int i = 0; i < data.Length; i++) 95 { 96 sum += Asc(data.Substring(i, 1)); 97 98 // sum += Convert.ToInt16(data.Substring(i, 1)); 99 } 100 string res = sum.ToString("X"); 101 res = res.Substring(res.Length - 2, 2); 102 return res; 103 } 104 105 106 107 private void btnWrite_Click(object sender, EventArgs e) 108 { 109 string[] write = new string[] { "2", "2" };//将准备写入PLC的值 110 // 将要写入PLC的值转化为16进制数,补齐2个字节,注意高低字节需要交换 111 string sWriteData = ""; 112 for (int i = 0; i < write.Length; i++) 113 { 114 115 int val = Convert.ToInt32(write[i].Length > 0 ? write[i] : "0"); 116 string s = val.ToString("X"); 117 while (s.Length < 4) 118 { 119 120 s = "0" + s; 121 } 122 sWriteData += s.Substring(2, 2) + s.Substring(0, 2); 123 124 } 125 126 MessageBox.Show(sWriteData); 127 //写入命令,1表示写入,1194表示D202这个地址的16进制,04表示D202,D203为4个BYTE, 128 //1194=(202*2)+4096的16进制数,至于用它表示D202的起始位置,三菱故意要这么麻烦了。 129 130 sWriteData = "1119404" + sWriteData + Chr(3); 131 // chr(2)和chr(3)是构成命令的标识符,然后加上校验和,命令组织完成。 132 133 sWriteData = Chr(2) + sWriteData + SumCheck(sWriteData); 134 MessageBox.Show(sWriteData); 135 //写入串口 136 com.Write(sWriteData); 137 //byte[]data = Encoding.ASCII.GetBytes(sWriteData); 138 //com.Write(data,0,data.Length); 139 140 } 141 142 } 143 144 } 145 146 147 148
异常图片如下:
不是弱不弱的问题,而是学习方法的问题,你这样的学习方法感觉不可取,现在的阶段你应该系统学习一下基础知识,而不是一直网上粘贴别人的代码,然后过来问问题。
程序设计不仅仅是编程而已,你还是网上找找学习大纲吧。你要学编程不仅仅是学一门语言而已(比如c#)还要学
数据结构
算法
操作系统
数据库设计
等等等等
如果你咽不下现在这口气,最好网上找一下教程系统学习,不然你这种方法还真赶超不了别人。你在有基础的情况下再去看别人代码,不懂再问,这样循循渐进才行。
谢谢。
无论是学习还是工作,我跟这个关系不大,我专业也不是这个,所以一开始入门确实挺难的。
学习C#是因为很喜欢这门语言,那个人每天来我帖子里不是讽刺就是侮辱。
@绿绿山水:
给你个基础教程
链接: https://pan.baidu.com/s/1nvIDMlF 密码: ezwa
@海之殇: 好想,谢谢你。
看了你的buttonClick,表示你能不能好好写代码。
for都比较了Length了,下面还有什么必要比较;
2.ToString("X")就是2的16进制了字符串表示了;
...
如果是设备,通常string就是string,int就是int,应该不会还要string来表示int,对于串口和低级设备来说,那是很大开销的,你可能得回头看看协议。
而且如果是PLC一般都有标准工控协议,原则上你不需要写通讯协议解析。
你得好好看看计算机基础,看来又是你
帮我看看为何会有异常报警呀》我测试的时候都通过了呀,怎么一运行就有异常了?
你帮我写一段读写三菱PLC地址的代码吧,要求读写M区和D区的地址。
@绿绿山水: 兄弟这不是“猪八戒”。上面异常都说了是端口关闭,你要先Open
@花飘水流兮: 我也知道是端口关闭呀,可是在哪里写open?你写出来代码,在哪个位置告诉我一下,在哪里写open?
换了个马甲又出来了,厉害厉害
快回答问题,废话少说。
总有一天,我会超越你,你也别太过于嘚瑟,博客园高手有的是,比你强的人也多的很,别瞧不起现在C#没有你熟悉的人。
现在你可能感觉自己很了不起,我提的问题,你认为不屑于回答,没必要回答,然后每天讽刺我几句,你觉得你这样对我,心里很开心是不?
我现在是比拟弱,C#也没法跟你比,但是我每天都在进步,我没有贪欲,每天只求进步一点点,我学我自己的C#,你不愿意回答可以不用回答,没有人强迫你,你何必讽刺我,打击我,嘲笑我?我是比你差,我承认C#没法跟你比,你到底想怎么样呢?一个巴掌拍死我?让我永远不再学C#?让我每天自卑?让我害怕C#?让我每天敬仰你?
@绿绿山水: 我不是那个意思,只是说其实你这些问题自己百度下就可以找到了,而且学的快,实在找不到问题的在这里提问,你是做自动化软件这块吗?我之前做过C#和三菱plc,西门子plc的通信,找了好久才找到的资料还是vb版本的,还好懂一点,转成C#中间也花了一段时间跟plc在线调试,总算弄好了,主要是控制xy轴的移动进行视觉检测
@绿绿山水: 其实就是跟你开开玩笑的,学习一个新技术都很难,关键入门,入门了在寻找问题的时候就有方向了,百度的时候也能准确的找到要找的文章,都是这么过来的,第一步学习如何搜关键词
@jqw2009: 是的,我有做过PLC程序。
你可以发给我一份C#与三菱PLC的通讯程序吗?只要能读写三菱PLC的地址就可以了。
只要能读写X Y M区D区就行,其他的C#基础知识我慢慢去摸索。
@jqw2009: 如果能有一份可以用C#读写一个三菱X Y M D这样的代码,我也知足了,并不苛求还懂更高深的。
大哥一个星期了还在这一个问题上卡着呢 ~~~~
有这个时间,去学习下基本语法。接着再看一下常规的串口操作流程是什么样~
老是让别人帮你写代码,给劳务费么
这是技术讨论好吧。你不愿意回答可以不用回答,那么多问问题的人都要给劳务费吗?
你想要钱,可以向博客园反馈,每个提问题的人都得付给你劳务费。
再说了,我有每天让别人给我写代码吗?我只是把自己的问题提出来,我有让你回答了吗?
我有让你帮我写代码了吗?
你想要钱,把卡号写出来,我打钱给你,发啊。
你给我指出来,我有让谁帮我写代码了?谁给我写过代码?
我有让你帮我写代码了吗?你给我写过代码了吗?
写代码我给劳务费,但是你除外。
你想给谁写去给谁写,我不需要你给我写代码。
是一个星期了,这一个星期以来,我每天都在努力的去解决这些代码中遇到的报错的问题。
这一个星期以来,这个代码测试通过了,运行中报端口关闭。
我是一个星期没彻底运行OK,你嘲讽吧,你讽刺吧,我没有你有能耐你牛B行了吧?