aardio 官方社区

 找回密码
 注册会员

QQ登录

只需一步,快速开始

搜索
查看: 29638|回复: 18

使用aardio编写的串口通讯,不过不完善,先发出来,希望共同研究学习

[复制链接]

8

主题

110

回帖

904

积分

三级会员

积分
904
发表于 2013-1-24 09:22:26 | 显示全部楼层 |阅读模式
虽然入门不久,但是真的很喜欢aardio,之前没有接触过编程,这个串口通讯也是参考论坛大侠们的,只是稍作修改,在界面配置,不废话了,上源码和工程,

  1. import win.ui;
  2. import win.ui.menu;
  3. import win.ui.statusbar;
  4. /*DSG{{*/
  5. mainForm = ..win.form(text="aardio Form";right=647;bottom=474;parent=...)
  6. mainForm.add(
  7. button={cls="button";text="开打串口";left=21;top=82;right=92;bottom=106;z=7};
  8. button2={cls="button";text="发送";left=152;top=123;right=208;bottom=162;z=8};
  9. button3={cls="button";text="命令1";left=9;top=171;right=110;bottom=207;z=9};
  10. button4={cls="button";text="命令2";left=121;top=171;right=222;bottom=207;z=15};
  11. combobox={cls="combobox";text="combobox";left=64;top=32;right=136;bottom=52;edge=1;items={};mode="dropdownlist";z=4};
  12. combobox2={cls="combobox";text="combobox2";left=64;top=56;right=135;bottom=76;edge=1;items={"1200";"2400";"4800";"9600";"38400";"57600";"115200"};mode="dropdownlist";z=6};
  13. edit={cls="edit";text="FE 03 04 01 FC";left=13;top=128;right=150;bottom=154;edge=1;multiline=1;z=10};
  14. edit2={cls="edit";left=238;top=8;right=641;bottom=426;edge=1;multiline=1;style=1539;z=11};
  15. groupbox={cls="groupbox";text="串口选项";left=10;top=15;right=138;bottom=110;edge=1;z=1};
  16. groupbox2={cls="groupbox";text="数据选项";left=141;top=15;right=236;bottom=110;edge=1;z=12};
  17. plus={cls="plus";left=95;top=77;right=136;bottom=109;background="\res\2.ico";dt=1;font=LOGFONT( name='宋体' );repeat="center";transparent=1;z=5};
  18. radiobutton={cls="radiobutton";text="收发AISCII码";left=144;top=46;right=231;bottom=71;z=13};
  19. radiobutton1={cls="radiobutton";text="收发Hex码";left=144;top=80;right=226;bottom=107;checked=1;z=14};
  20. static={cls="static";text="串口号:";left=18;top=40;right=66;bottom=54;transparent=1;z=2};
  21. static2={cls="static";text="波特率:";left=18;top=64;right=66;bottom=78;transparent=1;z=3};
  22. static3={cls="static";left=13;top=215;right=219;bottom=411;transparent=1;z=16}
  23. )
  24. /*}}*/

  25. //---串口波特率全局定义---
  26. var Serial_port = 1;
  27. var Serial_baud = 0x0c;//波特率9600
  28. var cdata = raw.buffer(256);  //分配串口发送数据内存
  29. mainForm.static3.text = "
  30. 说明:软件支持发送和接收AISCII码以
  31.       及HEX命令在软件界面上选择对
  32.       应的选项,发送和接收就会是对
  33.       应的命令格式。
  34. ";

  35. //----下面是状态栏函数------------
  36. status=win.ui.statusbar(mainForm)
  37. status.addItem("端口状态:", (mainForm.right - mainForm.left)/2/*宽度*/)
  38. status.addItem("1", (mainForm.right - mainForm.left)/2/*宽度*/)
  39. status.setText("操作状态:",2 /*第几个分块*/)

  40. //---创建菜单---
  41. var menu = win.ui.menu(mainForm);//创建主菜单
  42. menu.addTable(
  43. {
  44.     {
  45.         "文件";
  46.         {
  47.             //----------------
  48.             {
  49.                 "子菜单";
  50.                 function(id)
  51.                 {
  52.                     mainForm.msgbox("文件->子菜单")
  53.                 }
  54.             };
  55.             {{"---分割线---"}};//分隔线
  56.             {
  57.                 "子菜单2";
  58.                 function(id)
  59.                 {
  60.                     mainForm.msgbox("文件->子菜单2")
  61.                 }
  62.             }
  63.             {{"---分割线---"}};//分隔线
  64.             {"退出"; function(id)
  65.                 {
  66.                     mainForm.close();
  67.                 }
  68.             };//分隔线
  69.         } //----------------
  70.     };
  71.     {
  72.         "编辑";
  73.         {
  74.             //----------------
  75.             {
  76.                 "子菜单";
  77.                 function(id)
  78.                 {
  79.                     mainForm.msgbox("编辑->子菜单")
  80.                 }
  81.             };
  82.             {
  83.                 "子菜单2";
  84.                 function(id)
  85.                 {
  86.                     mainForm.msgbox("编辑->子菜单2")
  87.                 }
  88.             }
  89.         } //----------------
  90.     };
  91.     {
  92.         "编辑2";
  93.         {
  94.             //----------------
  95.             {
  96.                 "子菜单";
  97.                 function(id)
  98.                 {
  99.                     mainForm.msgbox("编辑2->子菜单")
  100.                 }
  101.             };
  102.             {
  103.                 "子菜单2";
  104.                 function(id)
  105.                 {
  106.                     mainForm.msgbox("编辑2->子菜单2")
  107.                 }
  108.             }
  109.         } //----------------
  110.     };
  111. } )
  112. //---启动前初始化组合框---
  113. for(i=1; 10; 1){
  114.     mainForm.combobox.add("COM"+tostring(i))
  115.     // mainForm.combobox2.add(tostring(i))
  116. }
  117. mainForm.combobox.selIndex = 1;
  118. /*
  119. mainForm.combobox2.insert("9600",-1);
  120. mainForm.combobox2.insert("38400",-1);
  121. mainForm.combobox2.insert("115200",-1);
  122. mainForm.combobox2.insert("9600",-1);
  123. */
  124. mainForm.combobox2.selIndex=1;
  125. //---创建串口显示图标---

  126. //---加载dll,声明函数---
  127. Pcom = raw.loadDll("\res\Pcomm.dll");
  128. //打开串口,正确返回0;C代码int WINAPI sio_open(int port);
  129. sio_open = Pcom.api("sio_open","int(int Serial_port)");
  130. //关闭串口,正确返回0;C代码int WINAPI sio_close(int port);
  131. sio_close = Pcom.api("sio_close","int(int port)" );
  132. //设置串口参数,正确返回0;C代码int WINAPI sio_ioctl(int port, int baud, int mode);
  133. sio_ioctl = Pcom.api("sio_ioctl","int(int port, int baud, int mode)" );
  134. //读取缓冲区数据,返回数据长度,为0表示没有读到数据;C代码int WINAPI sio_read(int port, char *buf, int len);
  135. sio_read = Pcom.api("sio_read","int(int port, pointer buf, int len)");
  136. //写入缓冲区数据,返回数据长度;C代码int WINAPI sio_write(int port, char *buf, int len);
  137. sio_write = Pcom.api("sio_write","int(int port, pointer buf, int len)");
  138. //设置中断函数,用来在接收大量数据的时候产生中断;C代码int WINAPI sio_cnt_irq(int port,VOID (CALLBACK *func)(int port), int count);
  139. sio_cnt_irq = Pcom.api("sio_cnt_irq","int(int port, func(int port), int count)");

  140. //------下面是初始化串口部分------
  141. //var Serial_port = 1;                       这个在后面获取端口号下拉组合框中的选项值
  142. //var Serial_baud = 0x0c;//波特率9600        这个在后面获取波特率下拉组合框中的选项值
  143. /*baud = (bits/sec)
  144. 0 = 50          6 = 600         12 = 9600           18 = 460800
  145. 1 = 75          7 = 1200        13 = 19200          19 = 921600
  146. 2 = 110         8 = 1800        14 = 38400
  147. 3 = 134.5       9 = 2400        15 = 57600
  148. 4 = 150         10 = 4800       16 = 115200
  149. 5 = 300         11 = 7200       17 = 230400
  150. */
  151. var wordlength = 0x03;//数据位bit_8
  152. /*bit_cnt (bit 0, 1) =  0x00 = bit_5
  153.                         0x01 = bit_6
  154.                         0x02 = bit_7
  155.                         0x03 = bit_8
  156. */
  157. var parity = 0x00; //奇偶校验EVEN
  158. /*parity (bit 3,4 5) =  0x00 = none
  159.                         0x08 = odd
  160.                         0x18 = even
  161.                         0x28 = mark
  162.                         0x38 = space
  163. */
  164. var stopbits = 0x00;//停止位stop_1
  165. /*stop_bit (bit 2) =    0x00 = stop_1
  166.                         0x04 = stop_2
  167. */
  168. //-----------上面是串口初始化部分-----------------------
  169. //*******下面是公共函数***********//
  170. //---串口打开函数---
  171. comopen = function(Serial_port,Serial_baud,parity,stopbits,wordlength){
  172.     var ret = 0;
  173.     var i = 0;
  174.     ret = sio_open(Serial_port);//打开串口
  175.     if(ret != 0)
  176.     {
  177.         win.msgboxTimeout("错误码:"+ret,"串口打开错误");
  178.         mainForm.button.text = "打开串口";
  179.          mainForm.plus.setBackground("\res\2.ico");
  180.         status.setText("端口状态:打开串口失败!",1 /*第几个分块*/);
  181.         return 0;
  182.     }
  183.     ret = sio_ioctl (Serial_port, Serial_baud, parity | stopbits | wordlength  );//设置串口参数:波特率、奇偶校验、停止位、数据位
  184.     if(ret != 0)
  185.     {
  186.         win.msgboxTimeout("错误码:"+ret,"串口设置错误");
  187.         mainForm.button.text = "打开串口";
  188.         mainForm.plus.setBackground("\res\2.ico");
  189.         status.setText("端口状态:打开串口失败!",1 /*第几个分块*/);
  190.         return 0;
  191.     }
  192. }
  193. //---串口发送数据函数---
  194. comwrite = function(Serial_port,str,buf){
  195.    if(mainForm.radiobutton.checked == true){
  196.            var len = sio_write(Serial_port,buf,#str)
  197.     return len;
  198.    }else {
  199.     str = string.replace(str,"\s","");//去除空格及换行符
  200.     for(i=1; #str;2){
  201.         buf[(i+1)/2] = eval("0X"+string.slice(str,i,i+1));
  202.     }
  203.     var len = sio_write(Serial_port,buf,#str/2)
  204.               return len;
  205.    }
  206. }
  207. //---串口接收数据函数---
  208. comread = function(Serial_port,buf){
  209.     var len = sio_read(Serial_port,buf,#buf);
  210.     var str = ""
  211.       for(i=1; len; 1)
  212.             {
  213.                if(mainForm.radiobutton.checked != true){
  214.                        str = str++" "++string.right(string.format("%02X", buf[ i ]),2);//默认转换成有符号字节,因此取最右边两位
  215.                }else {
  216.                        str = str ++ string.pack(buf[i]);//默认转换成AISCII《这个地方感觉中断回调函数有问题》
  217.                }       
  218.             }
  219.     return str,len;
  220. }

  221. //---串口号(需要写配置项)---
  222. mainForm.combobox.oncommand = function(id,event){
  223.     //mainForm.msgbox( mainForm.combobox.text );
  224.     if( event = 0x1/*_CBN_SELCHANGE*/ ){
  225.         var selText = mainForm.combobox.selText;
  226.         
  227.         Serial_port = string.match(selText,"\d+");//给全局变量的串口端口赋值
  228.         /*
  229. select(selText) {
  230.             case "COM1" {
  231.                 win.msgboxTimeout("当前串口号:"+tostring(string.match(selText,"\d+")));
  232.             
  233.             }
  234.             case "COM2" {
  235.                  win.msgboxTimeout("当前串口号:"+selText)
  236.             }
  237.             case "COM3" {
  238.                  win.msgboxTimeout("当前串口号:"+selText)
  239.             }
  240.         }
  241. */
  242.     }  
  243. }

  244. //---波特率(需要写配置项)---
  245. mainForm.combobox2.oncommand = function(id,event){
  246.     //mainForm.msgbox( mainForm.combobox2.text );
  247.     if( event = 0x1/*_CBN_SELCHANGE*/ ){
  248.    
  249.         var selText = mainForm.combobox2.selText;
  250.         status.setText("操作状态:当前波特率"+selText + "重新打开串口生效", /*第几个分块*/)   
  251.                   
  252.         select(selText) {
  253.             case "1200" {
  254.                  Serial_baud = 0x07;
  255.             }
  256.             case "2400" {
  257.                  Serial_baud = 0x09;
  258.             }
  259.             case "4800" {
  260.                  Serial_baud = 0x0a;
  261.             }
  262.             case "9600" {
  263.                  Serial_baud = 0x0c;
  264.             }
  265.             case "38400" {
  266.                  Serial_baud = 0x0e;
  267.             }
  268.             case "57600" {
  269.                  Serial_baud = 0x0f;
  270.             }
  271.             case "115200" {
  272.                  Serial_baud = 0x10;
  273.             }
  274.         }
  275.     }
  276. }
  277.            
  278. //---开关串口---
  279. mainForm.button.oncommand = function(id,event){
  280.     if(mainForm.button.text != "关闭串口")
  281.     {
  282.         mainForm.button.text = "关闭串口";
  283.         mainForm.plus.setBackground( "\res\4.ico" );
  284.         status.setText("端口状态:正在打开...",1 /*第几个分块*/)
  285.         var i = comopen(Serial_port,Serial_baud,parity,stopbits,wordlength);//打开串口并设置串口参数;   
  286.             if(i != 0){
  287.                     status.setText("端口状态:端口打开成功,端口号:"+mainForm.combobox.selText +" 波特率:" +mainForm.combobox2.selText,1 /*第几个分块*/);
  288.             }
  289.     }
  290.     else
  291.     {
  292.         mainForm.button.text = "打开串口";
  293.          mainForm.plus.setBackground("\res\2.ico");
  294.         sio_close(Serial_port);                            //关闭串口
  295.         status.setText("端口状态:端口号:"+mainForm.combobox.selText +" 已关闭" ,1 /*第几个分块*/)
  296.     }
  297. }

  298. mainForm.button2.oncommand = function(id,event){
  299.     //mainForm.msgbox( mainForm.button2.text );
  300.     var str = mainForm.edit.text;
  301.    len = comwrite(Serial_port,str,cdata);             //发送
  302.    status.setText("端口状态:已发送[ "+tostring(len)+" ]字节",1 /*第几个分块*/);
  303. }

  304. mainForm.button3.oncommand = function(id,event){
  305.         //mainForm.msgbox( mainForm.button3.text );
  306.        
  307. }
  308. /**
  309. //---下面使用定时器查询串口接收状态---
  310. //使用定时器查询有一个严重缺陷,如果发送的速度快,那么接收端显示出来的数据就不准确
  311. tmid = mainForm.setInterval(
  312.         100/*毫秒*/,
  313.         function(hwnd,msg,id,tick){//定时执行代码
  314.                 str1, len1 = comread(Serial_port,cdata)              //接收
  315.                 if(len1 == -1){ return ; }
  316.                 if(len1 != 0){
  317.                  status.setText("接收状态:已收到[ "+tostring(len1)+" ]字节;"+str1,2 /*第几个分块*/);//问题就是这个地方统计不准确
  318.                  mainForm.edit2.appendText(str1);       
  319.                 }       
  320.                 //mainForm.clearInterval(id)//移除此定时器
  321.                 //mainForm.changeInterval(id,2000)//重新设定时间间隔
  322.         }
  323. );
  324. **/
  325. //---下面使用定时器查询串口接收状态---
  326. //电车男建议
  327. tmid = mainForm.setInterval(
  328.         100/*毫秒*/,
  329.         function(hwnd,msg,id,tick){//定时执行代码
  330.                 mainForm.changeInterval(id,20000) //设置20秒
  331.                 str1, len1 = comread(Serial_port,cdata)              //接收
  332.                 if(len1 == -1){ return ; }
  333.                 if(len1 != 0){
  334.                  status.setText("接收状态:已收到[ "+tostring(len1)+" ]字节;"+str1,2 /*第几个分块*/);//问题就是这个地方统计不准确
  335.                  mainForm.edit2.appendText(str1);       
  336.                 }       
  337.                 mainForm.changeInterval(id,100) //重新设置100毫秒
  338.                 //mainForm.clearInterval(id)//移除此定时器
  339.                 //mainForm.changeInterval(id,2000)//重新设定时间间隔
  340.         }
  341. );


  342. mainForm.show()
  343. win.loopMessage();

复制代码
接下来就会要回家过年了,我相信很多电子爱好者,也i想写出自己的调试助手软件,aardio给我们提供了这个平台,非常感谢Jacen,这个软件有缺陷,接收数据的地方还需要优化,现在是定时器查询。
Serial.JPG

串口.7z

65.41 KB, 下载次数: 1897

点评

真棒: 5.0
真棒: 5
  发表于 2013-1-24 12:05

评分

参与人数 6 +195 收起 理由
edwardj + 5 很给力!
fywhc + 30 很给力!
大云斗 + 30 很给力!
weell + 50 现在成大牛了
ProPHP + 30 赞一个!
coder + 50 赞一个!

查看全部评分

2

主题

39

回帖

301

积分

培训班

积分
301
发表于 2013-1-26 17:51:02 | 显示全部楼层
感谢分享辛勤劳动的成果!

4

主题

18

回帖

132

积分

一级会员

积分
132
发表于 2013-2-5 15:27:55 | 显示全部楼层
感谢分享辛勤劳动的成果!

1

主题

1

回帖

17

积分

新手入门

积分
17
发表于 2013-2-6 10:05:01 | 显示全部楼层
感谢楼主的贡献,在楼主的基础上,对代码进行了一些改进,解决了ASCII码发送和接收的问题。同时解决了第一次运行如果不点击选择波特率时,设置的波特率和默认波特率不符的问题。将串口部分封装到一个库里了,更方便使用。 TestUart.rar (69.89 KB, 下载次数: 1948)

0

主题

54

回帖

362

积分

二级会员

积分
362
QQ
发表于 2013-2-6 21:44:24 | 显示全部楼层
学习一下  谢谢

9

主题

18

回帖

283

积分

二级会员

积分
283
发表于 2013-2-7 16:36:58 | 显示全部楼层
写的很好,用来作为参考

0

主题

4

回帖

22

积分

新手入门

积分
22
发表于 2013-4-1 11:10:20 | 显示全部楼层
正需要 这方面,谢谢分享。
初学,学习一下!

4

主题

43

回帖

489

积分

培训班

积分
489
发表于 2013-4-4 09:29:10 | 显示全部楼层
这个也行。真牛。

9

主题

86

回帖

630

积分

三级会员

叫我何细尔

积分
630
QQ
发表于 2013-4-4 21:25:28 | 显示全部楼层
收藏了4#修改后的源码,感谢楼主无私奉献。

0

主题

4

回帖

32

积分

新手入门

积分
32
发表于 2013-4-6 00:03:06 | 显示全部楼层
之谢分享,正需要这个

0

主题

4

回帖

32

积分

新手入门

积分
32
发表于 2013-4-7 11:09:35 | 显示全部楼层
//设置中断函数,用来在接收大量数据的时候产生中断;C代码int WINAPI sio_cnt_irq(int port,VOID (CALLBACK *func)(int port), int count);
sio_cnt_irq = Pcom.api("sio_cnt_irq","int(int port, func(int port), int count)");

这个申明是正确的么??
看教程是不是应该是:
sio_cnt_irq = Pcom.api("sio_cnt_irq","int(int port, POINTER callback, int count)");

0

主题

11

回帖

72

积分

一级会员

积分
72
发表于 2013-11-3 18:12:21 | 显示全部楼层
很好! 刚接触aardio学习一下。

0

主题

4

回帖

49

积分

新手入门

积分
49
发表于 2014-1-24 17:31:44 | 显示全部楼层
正好要用到,学习一下。多谢分享。

12

主题

68

回帖

809

积分

培训班

积分
809
QQ
发表于 2014-5-17 09:18:55 | 显示全部楼层
那个sio_cnt_irq函数到底应该怎么调用啊??能指点下吗?

1

主题

11

回帖

124

积分

一级会员

积分
124
发表于 2015-2-28 19:24:28 | 显示全部楼层
感谢楼主和4楼分享,收藏学习了!

5

主题

42

回帖

540

积分

三级会员

积分
540
发表于 2015-3-20 21:14:33 | 显示全部楼层
借用一下,先谢了!

0

主题

11

回帖

72

积分

一级会员

积分
72
发表于 2016-3-17 23:09:37 | 显示全部楼层
正在研究串口!

0

主题

1

回帖

14

积分

新手入门

积分
14
发表于 2017-11-16 09:22:45 | 显示全部楼层
过来学习学习!

4

主题

14

回帖

189

积分

一级会员

积分
189
发表于 2017-12-26 09:29:33 | 显示全部楼层
楼主有没有解决中文接收的问题?                          
您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

手机版|未经许可严禁引用或转载本站文章|aardio.com|aardio 官方社区 ( 皖ICP备09012014号 )

GMT+8, 2024-11-4 19:03 , Processed in 0.088108 second(s), 27 queries .

Powered by Discuz! X3.5

Copyright © 2001-2024 Tencent Cloud.

快速回复 返回顶部 返回列表