C# 实现多串口数据采集,串口通讯使用问答通讯模式

uhen 2014-08-08 10:57:13
PC机和串口服务器连接(采集64个串口数据),希望大神给个思路,最好能有代码例程,越详细越好,分不够可以再加!希望大神不吝赐教
...全文
1004 42 打赏 收藏 转发到动态 举报
写回复
用AI写文章
42 条回复
切换为时间正序
请发表友善的回复…
发表回复
mjp1234airen4385 2014-09-05
  • 打赏
  • 举报
回复
39楼的还是重开个帖子吧。 或者问问楼主,你俩是初学者交流起来有共同语言。
Michaellovekobe 2014-09-05
  • 打赏
  • 举报
回复
引用 37 楼 Z65443344 的回复:
[quote=引用 36 楼 mjp1234airen4385 的回复:] 到底是什么情况? lz还是没有搞定带参数的线程和串口么?
楼主需要恶补基础了,如何往类里传递参数,如何往线程里传递参数,这些都是相当基础的东西 比起64个串口通信的问题,简单多了[/quote] 请问如何将serilport控件如read,write等函数,还有一些其他的变量如finishflg(接收完成标志),timeout(接收超时标志)等,封装到类中,而且是带串口号参数的类?新手,真心求教,最好能给个例子
Michaellovekobe 2014-09-05
  • 打赏
  • 举报
回复
引用 19 楼 mjp1234airen4385 的回复:
1,先做好一个串口的数据接收,并且做成类。 2,学习线程知识。 3,新建一个类,把1中的串口类和线程封装进去。 4,实例化64个3中的类。
请问如何把serialport控件,封装成类 现在的情况是下位机不多,几十个,如果每个都要处理接收什么的,确实麻烦,都重复了。
uhen 2014-08-21
  • 打赏
  • 举报
回复
今天接了28个传感器,貌似问题不大,没有出现乱掉的情况,可能是moxa里面有fifo或者协议栈的缘故,偶尔会出现2行数据同时显示的情况,基本算是解决了吧。办法就是写个串口类,用是windows自带的SerialPort类,然后实例化需要的串口
於黾 2014-08-14
  • 打赏
  • 举报
回复
当然我前面写的是直接启动64个线程,并传不同参数的方法. 如果你将串口封装到了类里,可以这样定义:

public class NPort
{
public int Index=0;
public void NPort()
{
}
public void NPort(int i)//重载构造函数
{
Index=i;
//以下执行开启串口等操作
}
}

//实例化类的代码
for(int i=0;i<64;i++)
{
NPort N1=new NPort(i);
}
於黾 2014-08-14
  • 打赏
  • 举报
回复
我还是写全点吧

void Form_load()
{
for(int i=0;i<64;i++)
{
Thread th1=new Thread(fun1);
th1.Start(i);
}
}

void fun1(object o)
{
int i=(int)o;//i就是前面传进来的那个i,对应0-63,用这个索引到全局数组里取串口名称等参数
}
於黾 2014-08-14
  • 打赏
  • 举报
回复
thread th1=new thread(fun1); th1.start(index); void fun1(object o) { int i=(int)o; } 就行了啊. 然后串口名称,波特率,奇偶校验那些设置,都定义成全局数组,线程获得了索引,就到数组的对应位置去拿啊
uhen 2014-08-14
  • 打赏
  • 举报
回复
引用 30 楼 Z65443344 的回复:
那怕什么,做个配置界面,写入配置文件 启动的时候,读配置文件,看到底虚拟出多少个口,名称分别都叫什么,然后循环一下,实例化类,把参数传进去,不就得了
你一直说传参数,说的简单,怎么传??
vistang 2014-08-14
  • 打赏
  • 举报
回复
SerialPort 你可以创建多个,然后绑定多个端口,很久没用了, 但是记得好像读取数据是事件回调的,然后你都统一处理就是。
於黾 2014-08-14
  • 打赏
  • 举报
回复
引用 36 楼 mjp1234airen4385 的回复:
到底是什么情况? lz还是没有搞定带参数的线程和串口么?
楼主需要恶补基础了,如何往类里传递参数,如何往线程里传递参数,这些都是相当基础的东西 比起64个串口通信的问题,简单多了
mjp1234airen4385 2014-08-14
  • 打赏
  • 举报
回复
到底是什么情况? lz还是没有搞定带参数的线程和串口么?
於黾 2014-08-13
  • 打赏
  • 举报
回复
引用 20 楼 u010457371 的回复:
[quote=引用 19 楼 mjp1234airen4385 的回复:] 1,先做好一个串口的数据接收,并且做成类。 2,学习线程知识。 3,新建一个类,把1中的串口类和线程封装进去。 4,实例化64个3中的类。
1.我用C#SerialPort已经实现并完成类的封装; 2.正在学习线程只是; 3.现在纠结与实例化64个类,64个触发函数难道一个一个写出来么? 4.新手,不怕你详细 [/quote] 你不会把触发函数也封装到类里去,至于触发之后,数据保存到哪个数组,可以通过参数传递进去
uhen 2014-08-13
  • 打赏
  • 举报
回复
来个版主大人吧
uhen 2014-08-13
  • 打赏
  • 举报
回复
引用 19 楼 mjp1234airen4385 的回复:
1,先做好一个串口的数据接收,并且做成类。 2,学习线程知识。 3,新建一个类,把1中的串口类和线程封装进去。 4,实例化64个3中的类。
1.我用C#SerialPort已经实现并完成类的封装; 2.正在学习线程只是; 3.现在纠结与实例化64个类,64个触发函数难道一个一个写出来么? 4.新手,不怕你详细
於黾 2014-08-13
  • 打赏
  • 举报
回复
那怕什么,做个配置界面,写入配置文件 启动的时候,读配置文件,看到底虚拟出多少个口,名称分别都叫什么,然后循环一下,实例化类,把参数传进去,不就得了
uhen 2014-08-13
  • 打赏
  • 举报
回复
引用 24 楼 vistang 的回复:
楼主应该是64个串口数据同时需要接收和处理, 网上找到一个处理SerialPort的类应该不难, 能实现的也就是一个线程监听一个com了, 循环创建多个SerialPort实例,然后处理。
差不多是你说的那个样子,但是还有个问题就是最多是64个,具体多少个串口还得看情况,也可能是四五十个,而且端口也可能是跳着的,所以你懂的。。。
於黾 2014-08-13
  • 打赏
  • 举报
回复
引用 27 楼 mjp1234airen4385 的回复:
如果你的64个串口处理的是相同的业务,那么你就可以写一个处理函数.实例化64个了. 如果业务不相同,那就只能分析出每种业务,并且设计不同的处理函数了.
串口类,应该只负责接收数据,发送数据,不应该关心具体的业务处理吧? 要发不同的东西,实例化的时候传进去啊 收到字节要不同的处理,在别的地方处理收回来的数据就好了啊
mjp1234airen4385 2014-08-13
  • 打赏
  • 举报
回复
如果你的64个串口处理的是相同的业务,那么你就可以写一个处理函数.实例化64个了. 如果业务不相同,那就只能分析出每种业务,并且设计不同的处理函数了.
於黾 2014-08-13
  • 打赏
  • 举报
回复
实际上这样使用,是线程安全的,因为每个串口其实都在操作不同的数组元素,并不是同一个对象 而且数组本身是引用类型,可以直接值传递进去并修改,只要不在类里使用new语句,改的其实就是原来的数组
於黾 2014-08-13
  • 打赏
  • 举报
回复
你定义一个二维数组来存数据 串口类里传入这个二维数组的名字和索引,触发函数里,把串口数据写入对应位置,不就得了 比如定义byte[,] data=new byte[64,256]; 类里传入data和Index:0-63的索引(当然每个实例对应一个不同的值) 回调函数里, for(int i=0;i<buf.length;i++) { data[Index,i]=buf[i]; }
加载更多回复(21)

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧