怎样用perl控制串口控制器

vc 串口编程打开串口失败-CSDN论坛
vc 串口编程打开串口失败
我的程序不知道为什么总是打开串口失败,现在已经确定不是因为硬件的问题,因为用别的程序是没问题,就自己的不行,由于代码比较多,又发不上来,现在请教大家问题可能出现在哪里?有没有哪位大侠可以帮我看看程序的,谢谢了~
调试程序看错误码,根据错误码分析问题。
常见情况是名称或其它参数不对,或者程序权限不够。
就打开串口来说,不会需要几行代码的,所以代码比较多,肯定是不对的。楼主首先自己要理解打开串口是怎么个回事。
把你程序发给我看看吧,加我QQ:
this-&m_hComm&=&CreateFile(&&&&&
(LPTSTR)(LPCTSTR)str,&&&//COM:3
GENERIC_READ&|&GENERIC_WRITE,&
OPEN_EXISTING,&
FILE_FLAG_OVERLAPPED,
if(this-&m_hComm&==&INVALID_HANDLE_VALUE)
DWORD&nErrorNo&=&GetLastError();
LPSTR&lpB&&&&
::FormatMessage(&FORMAT_MESSAGE_ALLOCATE_BUFFER&|&
&&FORMAT_MESSAGE_IGNORE_INSERTS&&|&
&&FORMAT_MESSAGE_FROM_SYSTEM,
&&nErrorNo,&//&此乃错误代码,通常
&&LANG_NEUTRAL,
&&(LPTSTR)&&&lpBuffer,
CString&strErrorCause&&=&&lpBuffer&&?&&_T(lpBuffer)&:&_T(&"&没有错误信息.&"&);
strErrorCause.Format("%s",strErrorCause);&
//&释放缓存&
LocalFree&(lpBuffer);&
::AfxMessageBox(strErrorCause);
//::AfxMessageBox(_T("串口打开失败"));
return&FALSE;
//&看看输出的是什么?
你用的是不是Mscomm?&是的话,要看你初始化的时候&选择的com口是否正确。&比如你选择是com1,如果你的电脑上没有com1,那就会运行时&提示错误。
不懂帮顶···
还是把主要代码贴一下吧,具体问题具体分析
首先要知道你是用的mscomm还是用的CSerialport类。然后贴出你的打开串口部分的代码,see&see。
先用串口调试助手打开你要打开的串口看看能成功不。
先找个串口调试程序(设备端的,网上很多),测一下是不是串口或串口号有问题。先重启设备再进行测试,避免串口已被打开没有关闭。
“是不是也要在驱动中,把串口配置名为&COM1呢”
那你串口驱动中,注册表Prefix设置不是这个COM?
打开串口用:
HANDLE&hCom&=&CreateFile(L"COM1:",GENERIC_READ&|&GENERIC_WRITE,
&&0,NULL,OPEN_EXISTING,0,NULL);
就可以了。
你的设备是不是没有这个串口,或者被占用了呢。&
失败的可能性就是串口被占用或者你现在链接的串口与你程序中希望打开的串口不是同一个串口
串口代码同步&,异步的我多有&&用串口类吧&&QQ&
用这个工具调试吧,不占用串口资源。
可以枚举出能用的串口,可以看运行到哪步,可以监视数据,开发必备工具。
注意一定按照下面说明的操作顺序操作。
下载地址:
http://download.cnet.com/ComTrace/-.html?tag=mncol
感觉好别忘了给个review(评论),谢谢!
How&to&use&it?
1.Run&ComTrace
2.Select&serial&port&name(e.g.&COM1)
3.Run&serial&port&application&program&that&you&want&to&debug(e.g.&Windows&HyperTerminal)
4.debug......(e.g.&press&any&key&in&Windows&HyperTerminal,&then&watch&the&data&that&is&captured.)
5.Close&application&program(e.g.&Windows&HyperTerminal)
6.Close&ComTrace
Notice:&You&must&operate&by&the&order,&only&support&Win2000&and&WinXp(32&bit)&system!
CSerialPort&MSCOMM&都用过,楼主加个Q&研究一下了.&
可能是串口被占用&&&最好自己调试下,看是哪一步过不去
游客!!!!!!!!!!!!!!!!!!!!!!!!
三颗星!关注!帮顶!
关键是设备名称要写对:
&&std::string&device&=&"COM5";&&//for&Linux:&"/dev/mobilephone";
&&_file&=&CreateFile(device.c_str(),GENERIC_READ&|&GENERIC_WRITE,&0,&NULL,&OPEN_EXISTING,&FILE_ATTRIBUTE_NORMAL&|&FILE_FLAG_OVERLAPPED,&NULL&);
&&if&(_file&==&INVALID_HANDLE_VALUE)
我也碰到了这样的问题,不过估计是程序本身的原因。你要仔细检查代码。
我也遇到过同样的问题,是窗口调试助手把串口占用了,没注意,找了好长时间原因,他粗心了!
回复php怎样操作串口_百度知道
php怎样操作串口
我有更好的答案
这个最好用C/C++、Python、Perl来搞,PHP一般是做网页的,搞这个够呛,当然如果有API就方便很多了
采纳率:87%
来自团队:
通过php扩展dio。
为您推荐:
其他类似问题
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。24小时热门版块排行榜&&&&
(正式写手)
在线: 692.8小时
虫号: 761880
注册: 专业: 高分子材料结构与性能
自己搞的一个记录串口天平数据的小脚本,请高手指点已有3人参与
天平的自动数据记录平时比较常用,网上找到的各种软件各有不满意的地方,后来就自己搞了一个,因为本来就是业余学了一点python,写的很不专业,现在发上来,请高手给指正一下。默认的串口命令是梅特勒天平的,可以修改。个人觉得上面最不满意的是多线程那儿,我是直接扒的网上一个最简单的方式的,用的是thread模块,都不是threading,如果有高手愿意给帮忙改进,非常感激。
& 本帖附件资源列表
欢迎监督和反馈:小木虫仅提供交流平台,不对该内容负责。
本内容由用户自主发布,如果其内容涉及到知识产权问题,其责任在于用户本人,如对版权有异议,请联系邮箱:
12:16:01,&4.07 K
& 猜你喜欢
已经有22人回复
已经有19人回复
已经有8人回复
已经有7人回复
已经有41人回复
已经有20人回复
已经有5人回复
已经有8人回复
已经有10人回复
已经有14人回复
思考,让这个世界更有趣。
(正式写手)
在线: 692.8小时
虫号: 761880
注册: 专业: 高分子材料结构与性能
引用回帖:: Originally posted by chemhehe at
你好 、我现在就遇到想实时称重的需要,
你的这个脚本能转化为 可执行文件吗?
对python不懂,非常感谢。 转换是可以,但是因为存在编码问题,总是会经常在很多电脑上打不开,所以还不如就在用的电脑上装个python和相应的模块,双击就能运行,不懂也可以用的
思考,让这个世界更有趣。
(正式写手)
在线: 692.8小时
虫号: 761880
注册: 专业: 高分子材料结构与性能
引用回帖:: Originally posted by mengfeixueaini at
能不能搞个教程?我对这个非常感兴趣,就是不知道怎么发送命令获取数据。搞了好久没有搞成,后来就放弃了 搞教程我的水平真的不够,你可以看一下我写的那里面的,我用的都是最简单的句子了,就是打开一个串口,发送有write指令,按仪器的格式发送字符串,读取就用read,我不是这个专业的,自己凑合糊弄出来的,没那么专业
思考,让这个世界更有趣。
相关版块跳转
第一性原理
我要订阅楼主
的主题更新
小木虫,学术科研互动社区,为中国学术科研免费提供动力
违规贴举报删除请发送邮件至:
广告投放与宣传请联系 李想 QQ:
QQ:&&邮箱:
Copyright &
MuChong.com, All Rights Reserved. 小木虫 版权所有奇怪的Qt串口接收问题-CSDN论坛
奇怪的Qt串口接收问题
我参考了以下例程:
http://hi.baidu.com/her02008/blog/item/263cccbf6039e47.html
#include&"mainwindow.h"
#include&"ui_mainwindow.h"
MainWindow::MainWindow(QWidget&*parent)&:
&&&&QMainWindow(parent),
&&&&ui(new&Ui::MainWindow)
&&&&ui-&setupUi(this);
&&&&struct&PortSettings&myComSetting&=&{BAUD115200,DATA_8,PAR_NONE,STOP_1,FLOW_OFF,500};
&&&&//定义一个结构体,用来存放串口各个参数
&&&&myCom&=&new&Win_QextSerialPort("com3",myComSetting,QextSerialBase::EventDriven);
&&&&//定义串口对象,并传递参数,在构造函数里对其进行初始化
&&&&myCom&-&open(QIODevice::ReadWrite);
&&&&//以可读写方式打开串口
&&&&connect(myCom,SIGNAL(readyRead()),this,SLOT(readMyCom()));
&&&&//信号和槽函数关联,当串口缓冲区有数据时,进行读串口操作
void&MainWindow::readMyCom()&&&&&//读串口函数
QByteArray&temp&=&myCom-&readAll();
//读取串口缓冲区的所有数据给临时变量temp
ui-&textBrowser-&insertPlainText(temp);
//将串口的数据显示在窗口的文本浏览器中
MainWindow::~MainWindow()
&&&&delete&
插上串口,Qt窗口接收不到单片机(MSP430)传出来的数据。但是这时候,打开串口调试助手,可以接收到数据,关闭串口助手,再次打开Qt程序,程序也可以接收到数据了!
如果把串口数据线拔掉重新插上,又会出现原来的问题。
第三方串口类我一直不喜欢就是因为总出现奇怪的问题,我通常都是使系统调用操作串口设备
是不是有其他程序占用这个串口,换个串口再试试。
引用&1&楼&yiyaaixuexi&的回复:第三方串口类我一直不喜欢就是因为总出现奇怪的问题,我通常都是使系统调用操作串口设备
问题是在Qt中调用windows的API进行串口读写总是出现“不能将char型转换成LPCTSTR类型”的问题。
//&Compiles&with&Microsoft&Visual&Studio&2008
#include&&windows.h&
#include&&stdio.h&
#include&&conio.h&
#include&&iostream&
HANDLE&OpenCom(LPCTSTR&ComName) //打开串口
//设备控制块DCB
COMMTIMEOUTS& //COMMTIMEOUTS结构可以规定读/写操作的超时
hCom&=&CreateFile(ComName,&&//串口号
GENERIC_READ&|&GENERIC_WRITE,//允许对设备进行读写访问
0,&//独占方式
OPEN_EXISTING,&//打开而非创建
FILE_ATTRIBUTE_NORMAL,&//
NULL); //通过CreateFile函数打开串口,在此处选择串口号
if(hCom==INVALID_HANDLE_VALUE)&//判断是否成功打开串口
dwError&=&GetLastError();
printf("&open&error!");
if(!SetupComm(hCom,&))&exit(1); //通过SetupComm函数初始化通信设备的通信参数
if(!GetCommState(hCom,&&dcb))&exit(1); //通过GetCommState函数获得当前的DCB结构
dcb.BaudRate&=&9600;
//设置波特率
((DWORD*)(&dcb))[2]&=&0x1001;
//&set&port&properties&for&TXDI&+&no&flow-control
dcb.ByteSize&=&8;
//设置数据位
dcb.Parity&=&NOPARITY;
//设置奇偶校验
dcb.StopBits&=&2;
//设置停止位
if(!SetCommState(hCom,&&dcb))&exit(1); //调用SetCommState函数设置修改过的DCB来配置串行口
ct.ReadIntervalTimeout&=&MAXDWORD;
//&读间隔超时&
ct.ReadTotalTimeoutMultiplier&=&0;
//&读时间系数
ct.ReadTotalTimeoutConstant&=&0;
//&读时间常量
//间隔超时被设置成MAXDWORD并且两个读总超时为0,那么在读一次输入缓冲区中的内容后读操作就立即完成,
//而不管是否读入了要求的字符。
ct.WriteTotalTimeoutMultiplier&=&0;
//&写时间系数
ct.WriteTotalTimeoutConstant&=&0;
//&写时间常量
//所有写超时参数均为0,那么就不使用写超时
if(!SetCommTimeouts(hCom,&&ct))&exit(1);//设置读/写操作的超时
DWORD&SendToBT(LPCTSTR&ComName,char*&str,int&n)//将数据发送到蓝牙串口,返回发送的字节数
//参数说明:ComName为串口名称,str为待发送字符串,n为长度
HANDLE&hCom&=&OpenCom(ComName);
//if(!WriteFile(hCom,&str,&n,&&nSend,&NULL))&
//exit(1); //将数据写入通信设备
Sleep(30);
char&buf[100];
if(!ReadFile(hCom,&buf,&8,&&nRec,&NULL))&
buf[nRec]&=&'\0';
//printf("recieve:&%s&\n",buf);
std::cout&&"recieve:"&&buf&&std::
CloseHandle(hCom);
一直想写自己的串口调试程序,可是始终没有动手,学习了
问题应该是出现在这里吧,其实不是没有收到数据,而已收到的数据类型不能显示出来,你需要转换一下数据类型才能显示出来
void&MainWindow::readMyCom()&&&&&//读串口函数
QByteArray&temp&=&myCom-&readAll();
//读取串口缓冲区的所有数据给临时变量temp
ui-&textBrowser-&insertPlainText(temp);
//将串口的数据显示在窗口的文本浏览器中
这里是显示字符串格式的,要是你单片机传上来的数据是16进制的话,需要这样改
ui-&textBrowser-&insertPlainText(temp.toHex());
我自己也是用这个类写了个modbus调试软件
把com3改成com1再试试
我碰到过类似的问题,貌似这个类的构造函数对串口参数的初始化不成功。
你试试打开串口后,手动调用setBaudRate、setParity等函数,再配置一遍参数。
你用串口调试助手打开串口,事实上已经初始化参数了,再打开你写的程序,自然可以正常使用了。
还有,“不能将char型转换成LPCTSTR类型”是因为使用unicode编码的缘故。
我也做过串口的调试程序,对于楼主的疑问,我想应该是这个问题,在那篇文章的最后有这么一段话:其实,上面的三个问题是一个问题,它的结论是,写串口程序时,要先打开串口再对它进行设置,不然设置就不会起作用。所以,这里应该说明,第一个和第二个程序都是不太正确的,正确的方法应该是像第三个程序一样,先定义Win_QextSerialPort类对象,然后打开串口,再用那几个设置函数对串口进行设置。
http://blog.csdn.net/yafeilinux/article/details/4717706这是文章链接。
其实楼主不必要非要用这个第三方类的,在Google仓库里有很多其他第三方类的,而且有的还是在实时维护着呢,我们就是换了另外一个第三方库,比这个好用的。
我用的qextserialport&暂时没问题
引用&11&楼&sryan&的回复:我用的qextserialport&暂时没问题
我用这个类也出现一些奇怪的问题,我觉得这个类还是不太稳定。
引用&10&楼&xiaoliang_1&的回复:我也做过串口的调试程序,对于楼主的疑问,我想应该是这个问题,在那篇文章的最后有这么一段话:其实,上面的三个问题是一个问题,它的结论是,写串口程序时,要先打开串口再对它进行设置,不然设置就不会起作用。所以,这里应该说明,第一个和第二个程序都是不太正确的,正确的方法应该是像第三个程序一样,先定义Win_QextSerialPort类对象,然后打开串口,再用那几个设置函数对串口进行设置。
请教一下,哪个类比较好用?可以给出地址吗?
我也参考了这个文件,写了个程序始终无法发送。
回复

我要回帖

更多关于 串口硬件流控制 的文章

 

随机推荐