C#怎么在一个窗口中调用另一个窗口的串口啊

坏假 2018-09-05 09:53:52
serialport在form2里:
public static SerialPort sp = new SerialPort();//实例化串口通讯类
form1里是这样调用的:
Form1.sp.WriteLine("VOLT?");
但是串口助手并没有打印出来“VOLT?”这四个字

请问各位大神怎么回事啊?
...全文
1726 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
上帝的亲哥哥 2018-12-21
  • 打赏
  • 举报
回复
你这个设计就是有问题的,你应该重新封装一下串口SerialPortHelper,辅助类,这个辅助类定义对外事件,无论在哪个窗口中只要订阅这个类的数据接收静态事件,就会收到数据就行了,你这样调用,必须会造成程序的混乱:


平底锅锅锅 2018-12-21
  • 打赏
  • 举报
回复
参数确定OK后,要检查系统是否存在这个COM,isOpen是否打开。或者用创建虚拟COM。
良朋 2018-12-21
  • 打赏
  • 举报
回复
把FORM2实例化,或者把你的串口初始化部分放在CLASS里
qq_15983319 2018-12-04
  • 打赏
  • 举报
回复
引用 11 楼 LYPokerface 的回复:
Form2
public SerialPort sp = new SerialPort();
private void button1_Click(object sender, EventArgs e)
{
Form1 form1 = new Form1(this);
form1.Show();
}

Form1
Form2 form2 = null;
public Form1(Form2 f2)
{
InitializeComponent();
this.form2 = f2;
}
private void Form1_Load(object sender, EventArgs e)
{
form2.sp.WriteLine("");
}



这个是正确答案 注意Form2中的构造函数里面的this 代表的是哪个
angel6709 2018-11-30
  • 打赏
  • 举报
回复
你可以把串口放到 两个form都能访问的层面,用单例。
  • 打赏
  • 举报
回复
form1 f=new form1(form 2);
雪狼孤竹 2018-09-06
  • 打赏
  • 举报
回复
引用 9 楼 weixin_38301455 的回复:
还是有问题,可否加下你QQ请教下,谢谢了


我这用不了QQ!

我上面写的只是两个窗体间调用的例子,具体还得看你的运用。

你现在的解决的问题:
1、在Form2下能够对串口正常操作(包括声明,参数设置,打开,关闭,发送数据,接收数据等等);
2、跨窗体调用。(我上面写的代码)
坏假 2018-09-06
  • 打赏
  • 举报
回复
引用 7 楼 Snowwolf_119 的回复:
[quote=引用 楼主 weixin_38301455 的回复:]
serialport在form2里:
public static SerialPort sp = new SerialPort();//实例化串口通讯类
form1里是这样调用的:
Form1.sp.WriteLine("VOLT?");
但是串口助手并没有打印出来“VOLT?”这四个字

请问各位大神怎么回事啊?


你这么调用不报错?

你这么做涉及到窗体间的参数传递。(网上很多)
你这样做,必须先打开Form2,然后打开Form1,才能执行。

你现在的情况,应该如下
Form2
public SerialPort sp = new SerialPort();
private void button1_Click(object sender, EventArgs e)
{
Form1 form1 = new Form1(this);
form1.Show();
}


Form1
Form2 form2 = null;
public Form1(Form2 f2)
{
InitializeComponent();
this.form2 = f2;
}
private void Form1_Load(object sender, EventArgs e)
{
form2.sp.WriteLine("");
}

[/quote]
还是有问题,可否加下你QQ请教下,谢谢了
雪狼孤竹 2018-09-06
  • 打赏
  • 举报
回复
引用 楼主 weixin_38301455 的回复:
serialport在form2里:
public static SerialPort sp = new SerialPort();//实例化串口通讯类
form1里是这样调用的:
Form1.sp.WriteLine("VOLT?");
但是串口助手并没有打印出来“VOLT?”这四个字

请问各位大神怎么回事啊?


你这么调用不报错?

你这么做涉及到窗体间的参数传递。(网上很多)
你这样做,必须先打开Form2,然后打开Form1,才能执行。

你现在的情况,应该如下
Form2
public SerialPort sp = new SerialPort();
private void button1_Click(object sender, EventArgs e)
{
Form1 form1 = new Form1(this);
form1.Show();
}


Form1
Form2 form2 = null;
public Form1(Form2 f2)
{
InitializeComponent();
this.form2 = f2;
}
private void Form1_Load(object sender, EventArgs e)
{
form2.sp.WriteLine("");
}

坏假 2018-09-06
  • 打赏
  • 举报
回复
引用 3 楼 qq_19305445 的回复:
调用Open()了么?


谢谢回答,引用open了
坏假 2018-09-06
  • 打赏
  • 举报
回复
引用 4 楼 duanzi_peng 的回复:
serialport在form2里
public static SerialPort sp = new SerialPort();//实例化串口通讯类
form1里是这样调用的:
Form1.sp.WriteLine("VOLT?");

-》在form2里面的话 怎么能用Form1.sp呢??

在这里敲错了,是Form2.sp,请问是什么原因呢
exception92 2018-09-06
  • 打赏
  • 举报
回复
serialport在form2里
public static SerialPort sp = new SerialPort();//实例化串口通讯类
form1里是这样调用的:
Form1.sp.WriteLine("VOLT?");

-》在form2里面的话 怎么能用Form1.sp呢??
Blithe239 2018-09-06
  • 打赏
  • 举报
回复
调用Open()了么?
坏假 2018-09-06
  • 打赏
  • 举报
回复
引用 1 楼 caozhy 的回复:
Form1.sp = new SerialPort("COM1"); //设置你的串口端口号
Form1.sp.BaudRate = 9600; //设置下波特率
别的校验位什么的你酌情也设置下
最后再Form1.sp.WriteLine("VOLT?");


波特率校验位停止位都设过了,不行啊
threenewbee 2018-09-05
  • 打赏
  • 举报
回复
Form1.sp = new SerialPort("COM1"); //设置你的串口端口号
Form1.sp.BaudRate = 9600; //设置下波特率
别的校验位什么的你酌情也设置下
最后再Form1.sp.WriteLine("VOLT?");
刚学C#时就一直想找到一种方法可以让.Net程序在未安装framework的电脑上运行,但一直没有找到真正可用的。虽然有些公司发布了可以将.net代码编译成navtive代码以脱离.net环境运行,如Remotesoft DOTNET Linker,Xenocode Postbuild等,但一直没有破解版,用它们编译的程序每次运行会添出个版权信息。最近偶然发现一种方法可以做到真正使程序脱离.net环境运行且没有任何版权信息添出,现将使用方法、源代码、测试程序发布于此: 请首先在文章末尾下载测试程序,是一个用C#做的串口工具,下载解压后有两个文件夹(FrameWork和APP)和一个程序(串口工具.exe),在APP文件夹下有一个名为9527.exe的程序,这个是C#真正的“串口工具.exe”,而主目录下的串口工具.exe只是一个Loader程序,它运行后首先判断电脑上有没有安装framework,若有,则直接启动APP下的9527.exe程序;若无,则通过framework虚拟机(FrameWork下的VM.exe(其实是飞信框架里的FetionVM.exe,修改了它的图标和版权,想改成其它的大家可以用VC改一下,有网友强列要求指出这一点,想不明白为什么,呵呵,让指出就指出吧,还要求指出调用的方法,,其实我连源程序都公布了,用说的这么明白吗))启动9527.exe程序。Loader程序不会打开任何窗口,并在启动真正应用程序后立即退出。Loader程序主函数(VC6.0编写)的代码附件上有
从四年前刚学C#时就一直想找到一种方法可以让.Net程序在未安装framework的电脑上运行,但一直没有找到真正可用的。虽然有些公司发布了可以将.net代码编译成navtive代码以脱离.net环境运行,如Remotesoft DOTNET Linker,Xenocode Postbuild等,但一直没有破解版,用它们编译的程序每次运行会添出个版权信息。最近偶然发现一种方法可以做到真正使程序脱离.net环境运行且没有任何版权信息添出,现将使用方法、源代码、测试程序发布于此: 请首先在文章末尾下载测试程序,是一个用C#做的串口工具,下载解压后有两个文件夹(FrameWork和APP)和一个程序(串口工具.exe),在APP文件夹下有一个名为9527.exe的程序,这个是C#真正的“串口工具.exe”,而主目录下的串口工具.exe只是一个Loader程序,它运行后首先判断电脑上有没有安装framework,若有,则直接启动APP下的9527.exe程序;若无,则通过framework虚拟机(FrameWork下的VM.exe(其实是飞信框架里的FetionVM.exe,修改了它的图标和版权,想改成其它的大家可以用VC改一下,有网友强列要求指出这一点,想不明白为什么,呵呵,让指出就指出吧,还要求指出调用的方法,,其实我连源程序都公布了,用说的这么明白吗))启动9527.exe程序。Loader程序不会打开任何窗口,并在启动真正应用程序后立即退出。Loader程序主函数(VC6.0编写)的代码如下:  主函数: int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { TCHAR fwVersion[VERSION]; if(CheckRegistryKeyExistance(fwVersion)) { if(CompareFWVersions(fwVersion, "2.0"))//最低版本要求2.0 { RunApplication(".\\app\\9527.exe");//直接运行 } else { //应用程序放在APP目录下,要启动的程序的名字为9527.exe, //9527周星弛在《唐伯虎点秋香》的代号,呵 RunApplication(".\\FrameWork\\VM.exe \".\\app\\9527.exe\"");//通过虚拟机运行 } } else { RunApplication(".\\FrameWork\\VM.exe \".\\app\\9527.exe\"");//通过虚拟机运行 } return 0; } 判断是否安装的代码就不贴出来了,可以在文章末尾下载整个VC6的工程文件看。 下面总结一下如何使用: 1. 下载我的例子程序 2. 清空APP下的所有文件 3. 把你自已的.net可执行程序和相关文件全部复制到APP下,并将可执行程序的名字改为9527.exe (不喜欢这个名字可以修改Loader程序重新编译) 4. 把主目录的“串口工具.exe"名字改成任何你想要的名字。(要改图标的话,建议下载我的Loader源程序,修改后重新编译) 大功告成,拿到一台没装.net的电脑上试试吧。祝好运。

110,546

社区成员

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

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

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