首页 新闻 会员 周边 捐助

写了一段代码,运行后不知弹出的这是什么东东?很神奇的。

0
悬赏园豆:10 [已解决问题] 解决于 2017-09-30 10:06

嗨,亲爱的朋友:

     下午好

      我写了一段代码,运行后,我先点写入按钮,弹出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    
复制代码

异常图片如下:

绿绿山水的主页 绿绿山水 | 菜鸟二级 | 园豆:248
提问于:2017-09-29 17:33
< >
分享
最佳答案
1

不是弱不弱的问题,而是学习方法的问题,你这样的学习方法感觉不可取,现在的阶段你应该系统学习一下基础知识,而不是一直网上粘贴别人的代码,然后过来问问题。

程序设计不仅仅是编程而已,你还是网上找找学习大纲吧。你要学编程不仅仅是学一门语言而已(比如c#)还要学

数据结构

算法

操作系统

数据库设计

等等等等

如果你咽不下现在这口气,最好网上找一下教程系统学习,不然你这种方法还真赶超不了别人。你在有基础的情况下再去看别人代码,不懂再问,这样循循渐进才行。

收获园豆:10
海之殇 | 菜鸟二级 |园豆:500 | 2017-09-30 09:54

 谢谢。

 无论是学习还是工作,我跟这个关系不大,我专业也不是这个,所以一开始入门确实挺难的。

  学习C#是因为很喜欢这门语言,那个人每天来我帖子里不是讽刺就是侮辱。

绿绿山水 | 园豆:248 (菜鸟二级) | 2017-09-30 09:58

@绿绿山水: 

给你个基础教程

链接: https://pan.baidu.com/s/1nvIDMlF 密码: ezwa

海之殇 | 园豆:500 (菜鸟二级) | 2017-09-30 10:03

@海之殇: 好想,谢谢你。

绿绿山水 | 园豆:248 (菜鸟二级) | 2017-09-30 10:03
其他回答(3)
0

看了你的buttonClick,表示你能不能好好写代码。

for都比较了Length了,下面还有什么必要比较;

2.ToString("X")就是2的16进制了字符串表示了;

...

如果是设备,通常string就是string,int就是int,应该不会还要string来表示int,对于串口和低级设备来说,那是很大开销的,你可能得回头看看协议。

而且如果是PLC一般都有标准工控协议,原则上你不需要写通讯协议解析。

你得好好看看计算机基础,看来又是你 

花飘水流兮 | 园豆:13615 (专家六级) | 2017-09-29 17:58

帮我看看为何会有异常报警呀》我测试的时候都通过了呀,怎么一运行就有异常了?

支持(0) 反对(0) 绿绿山水 | 园豆:248 (菜鸟二级) | 2017-09-29 19:36

你帮我写一段读写三菱PLC地址的代码吧,要求读写M区和D区的地址。

支持(0) 反对(0) 绿绿山水 | 园豆:248 (菜鸟二级) | 2017-09-29 19:47

@绿绿山水: 兄弟这不是“猪八戒”。上面异常都说了是端口关闭,你要先Open

支持(0) 反对(0) 花飘水流兮 | 园豆:13615 (专家六级) | 2017-09-29 19:48

@花飘水流兮: 我也知道是端口关闭呀,可是在哪里写open?你写出来代码,在哪个位置告诉我一下,在哪里写open?

支持(0) 反对(0) 绿绿山水 | 园豆:248 (菜鸟二级) | 2017-09-29 22:20
1

 换了个马甲又出来了,厉害厉害

jqw2009 | 园豆:2341 (老鸟四级) | 2017-09-30 08:30

快回答问题,废话少说。

支持(0) 反对(0) 绿绿山水 | 园豆:248 (菜鸟二级) | 2017-09-30 08:35

总有一天,我会超越你,你也别太过于嘚瑟,博客园高手有的是,比你强的人也多的很,别瞧不起现在C#没有你熟悉的人。

支持(0) 反对(0) 绿绿山水 | 园豆:248 (菜鸟二级) | 2017-09-30 08:37

 现在你可能感觉自己很了不起,我提的问题,你认为不屑于回答,没必要回答,然后每天讽刺我几句,你觉得你这样对我,心里很开心是不?

支持(0) 反对(0) 绿绿山水 | 园豆:248 (菜鸟二级) | 2017-09-30 08:39

我现在是比拟弱,C#也没法跟你比,但是我每天都在进步,我没有贪欲,每天只求进步一点点,我学我自己的C#,你不愿意回答可以不用回答,没有人强迫你,你何必讽刺我,打击我,嘲笑我?我是比你差,我承认C#没法跟你比,你到底想怎么样呢?一个巴掌拍死我?让我永远不再学C#?让我每天自卑?让我害怕C#?让我每天敬仰你?

支持(0) 反对(0) 绿绿山水 | 园豆:248 (菜鸟二级) | 2017-09-30 08:42

@绿绿山水: 我不是那个意思,只是说其实你这些问题自己百度下就可以找到了,而且学的快,实在找不到问题的在这里提问,你是做自动化软件这块吗?我之前做过C#和三菱plc,西门子plc的通信,找了好久才找到的资料还是vb版本的,还好懂一点,转成C#中间也花了一段时间跟plc在线调试,总算弄好了,主要是控制xy轴的移动进行视觉检测

支持(0) 反对(0) jqw2009 | 园豆:2341 (老鸟四级) | 2017-09-30 10:37

@绿绿山水: 其实就是跟你开开玩笑的,学习一个新技术都很难,关键入门,入门了在寻找问题的时候就有方向了,百度的时候也能准确的找到要找的文章,都是这么过来的,第一步学习如何搜关键词

支持(0) 反对(0) jqw2009 | 园豆:2341 (老鸟四级) | 2017-09-30 10:42

@jqw2009: 是的,我有做过PLC程序。

                  你可以发给我一份C#与三菱PLC的通讯程序吗?只要能读写三菱PLC的地址就可以了。

                  只要能读写X  Y  M区D区就行,其他的C#基础知识我慢慢去摸索。

支持(0) 反对(0) 绿绿山水 | 园豆:248 (菜鸟二级) | 2017-09-30 10:45

@jqw2009: 如果能有一份可以用C#读写一个三菱X  Y  M  D这样的代码,我也知足了,并不苛求还懂更高深的。

     

支持(0) 反对(0) 绿绿山水 | 园豆:248 (菜鸟二级) | 2017-09-30 10:52
-1

大哥一个星期了还在这一个问题上卡着呢 ~~~~

有这个时间,去学习下基本语法。接着再看一下常规的串口操作流程是什么样~

老是让别人帮你写代码,给劳务费么

hahanonym | 园豆:1460 (小虾三级) | 2017-09-30 09:05

这是技术讨论好吧。你不愿意回答可以不用回答,那么多问问题的人都要给劳务费吗?

你想要钱,可以向博客园反馈,每个提问题的人都得付给你劳务费。

再说了,我有每天让别人给我写代码吗?我只是把自己的问题提出来,我有让你回答了吗?

我有让你帮我写代码了吗?

你想要钱,把卡号写出来,我打钱给你,发啊。

支持(0) 反对(0) 绿绿山水 | 园豆:248 (菜鸟二级) | 2017-09-30 09:42

 你给我指出来,我有让谁帮我写代码了?谁给我写过代码?

我有让你帮我写代码了吗?你给我写过代码了吗?

写代码我给劳务费,但是你除外。

你想给谁写去给谁写,我不需要你给我写代码。

支持(0) 反对(0) 绿绿山水 | 园豆:248 (菜鸟二级) | 2017-09-30 09:44

 是一个星期了,这一个星期以来,我每天都在努力的去解决这些代码中遇到的报错的问题。

 这一个星期以来,这个代码测试通过了,运行中报端口关闭。

 我是一个星期没彻底运行OK,你嘲讽吧,你讽刺吧,我没有你有能耐你牛B行了吧?

 

支持(0) 反对(0) 绿绿山水 | 园豆:248 (菜鸟二级) | 2017-09-30 09:51
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册