串口数据读写问题 [问题点数:20分,结帖人gaozilin]

Bbs1
本版专家分:0
结帖率 98.04%
Bbs3
本版专家分:718
Bbs3
本版专家分:803
关于串口读写数据问题
请教大家一个<em>串口</em><em>读写</em><em>数据</em>的<em>问题</em>,自己写的一个<em>串口</em>类CSerialPort,封装有OpenCom(),CloseCom();rnWriteCom();ReadCom()...等等方法,一个用在短信发送的GsmComm类,包括GsmInit(),GsmSendMsg()....等等方法,GsmInit()中调用了类CSerialPort的方法WriteCom()对MODEM进行初始化;通过ReadCom()读取返回<em>数据</em>判断初始化是否成功.rnrn现在我在一个窗口类CMyDlg中开一个线程监控<em>串口</em>,有返回<em>数据</em>的时候调用ReadCom()读取<em>数据</em>并输出到列表框。我在这个窗口类中直接调用CSerialPort的WriteCom(),<em>数据</em>接收没有<em>问题</em>。但我在窗口类调用GsmInit()的时候,线程就监控不到<em>串口</em>有<em>数据</em>返回。不知道<em>问题</em>出在哪里,请高手指教。rnrn在CMyDlg.cpp中通过以下方式调用CSerialPort的成员函数是对的,如rn--CMyDlg.cpp--rnCSerialPort SP; //全局对象rnBOOL CMyDlg::OnInitDialog()rnrn ......rn if(!SP.OpenCom("COM1", 9600, NOPARITY, 8, ONESTOPBIT)) rn MessageBox("<em>串口</em>打开失败");rn ......rnrnrnvoid CMyDlg::OnSend() rnrn.......rn SP.WriteCom("AT\r\n"); //发送AT指令rn.......rn线程监控到<em>串口</em>有接收<em>数据</em>,调用SP.ReadCom()读<em>数据</em>等等,打开<em>串口</em>成功,返回<em>数据</em>也是正确的rnrnrn在类GsmComm中成员函数也用到了CSerialPort的方法rn--GsmComm.cpp--rnCSerialPort SPort; //全局对象rnBOOL GsmComm::GsmInit()rnrn CString strAns;rn // 测试设备是否存在rn SPort.WriteCom("AT\r\n");rn Sleep(100);rn SPort.ReadCom(strAns);rn if (strAns.Find("OK")<0) return FALSE; rnrn return TRUE;rnrnrnrn如果我在CMyDlg.cpp中如下方法调用的话,<em>串口</em>打开成功,但写<em>数据</em>失败,没有<em>数据</em>返回rnCMyDlg.cpprnrnvoid CMyMDlg::OnSend() //发送按钮rnrn ......rn GsmComm gsmc;// [color=#0000FF]此定义为全局对象结果也是一样的,应该不是<em>问题</em>所在[/color]rn gsmc.GsmInit();//初始化MODEM(此处涉及了写<em>数据</em>和读<em>数据</em>的函数)rn .....rn 这样初始化不成功,请问那里错了,那个地方出<em>问题</em>了。rn[color=#FF0000]另外,在CMyDlg中调用GsmComm的成员函数,只要不涉及到读<em>串口</em>和写<em>串口</em>等<em>串口</em>相关操作的,调用后的结果都是rn正确的,请教![/color]rnrn
rs232 串口读写数据问题
我对下位机是一点也不懂啊,现在和一个同事合作一个最简单的<em>串口</em>通信程序。rn上位机发送一个指令(假设是'a'这个byte)下位机回复一个字节表示温度。rnrn那么 WriteFile 和ReadFile的时候是不是和TCP类似,buffer里面只有用户<em>数据</em>?
Arduino 串口数据读写
源代码: char teststring; void setup() {  Serial.begin(9600);   //<em>串口</em>和Arduino之间的通信    }   void loop() {  while(Serial.available()&amp;gt;0){    teststring = Serial.read();     Serial.println(teststrin...
读写串口数据
我按照‘Delphi中<em>串口</em>通信的实现’(河南省计算中心 张海航)一文中所说的方法,来解决<em>串口</em>通信<em>问题</em>,但是在执行 rn move(buffer^,pchar(@rbuf^),bufferlength); rn时出现'pointer type required'的错误,我不知是怎么回事,请各位大师指教!rn我不胜感激!rnrnrn rnrn
C#串口数据读写
C#<em>串口</em><em>数据</em><em>读写</em>。 包含<em>读写</em><em>串口</em>。简单操作。
串口读写数据
在给单片机写文本<em>数据</em>时,单片机不能开辟一个很大的<em>数据</em>将他们全部接收后在处理,这个程序在发送文本<em>数据</em>时,再发送完一个十六进制数后,等待1ms,让单片机有足够的时间处理这个<em>数据</em>,这样单片机只要开辟一个字节即可实现接收一个文本<em>数据</em>。比如有一串<em>数据</em>是23 45 65 78 A4,写在文本文档中,这个程序发送23后会隔一段时间再发45。注意发送为16进制<em>数据</em>,且要用空格隔开。
MyComm,读写串口数据
MyComm使用delphi 4.0开发,可以在Delphi 3/4/5各版本中使用。
串口读写数据
我现在windows xp 系统上用VC++<em>读写</em><em>串口</em>,利用API函数,下位机是dsp,发送<em>数据</em>。现在有个<em>问题</em>是,当发送<em>数据</em>比如说‘A’后,上位机<em>串口</em>收到‘A’后,还继续接受大量的‘0’,感觉就是上位机把dsp<em>串口</em>端口处的低电平继续当做<em>数据</em>进行接受了,不能识别这种假<em>数据</em>。这如何处理呢?
串口数据读写.vi
在labview中编程,实现向<em>串口</em>写入<em>数据</em>并且从<em>串口</em>读出<em>数据</em>。
Linux_C_C++串口读写串口读写
串行口是计算机一种常用的接口,具有连接线少,通讯简单,得到广泛的使用。常用的<em>串口</em>是 RS-232-C 接口(又称 EIA RS-232-C)它是在 1970 年由美国电子工业协会(EIA)联合贝尔系统、 调制解调器厂家及计算机终端生产厂家共同制定的用于串行通讯的标准。它的全名是"<em>数据</em>终端设备(DTE)和<em>数据</em>通讯设备(DCE)之间串行二进制<em>数据</em>交换接口技术标准"该标准规定采用一个 25 个脚的 DB25 连接器,对连接器的每个引脚的信号内容加以规定,还对各种信号的电平加以规定。传输距离在码元畸变小于 4% 的情况下,传输电缆长度应为 50 英尺。 Linux 操作系统从一开始就对串行口提供了很好的支持
关于串口读写数据的文章
关于<em>串口</em><em>读写</em><em>数据</em>的文章 <em>串口</em><em>读写</em>程序!!!
串口读写数据发生畸变
我那块板卡是传送arinc429协议<em>数据</em>的接口卡,应该是属于isa <em>串口</em>通信的板卡吧,不是普通的com1、com2之类的!在设备管理器里面看不到该设备!rnrn 它是接受一个32位的<em>数据</em>,然后我发现输入FF(16进制)以下的<em>数据</em>都不会有什么<em>问题</em>,但输入fff,接收到的<em>数据</em>变成:eff,但输入eee,可以正常,输入ddd,又变成cdd,反正如此循环,都是最高位比实际的低一位!rnrn不知道是什么原因,大家<em>读写</em>别的板卡,有没有碰到过这种事???
C#读写串口数据Demo
用C#实现<em>读写</em><em>串口</em><em>数据</em>。用于自动化界面和板卡、PLC等通讯
串口读写数据样例 Android-SerialPort-API
<em>串口</em>模块<em>读写</em><em>数据</em>样例,原demo中读取<em>数据</em>转String时乱码,添加了ByteArrayToHexString显示账号
Java实现串口数据读写
最近的一个项目中需要将扫码枪读取到的<em>数据</em>取出,但是因为扫码枪是用<em>串口</em>传输<em>数据</em>的,比较少见,所以记录一下,当给自己做一个小结,有需要的同学也能参考一下。public class receiveData implements SerialPortEventListener{ protected static CommPortIdentifier portid = null; //通讯端口标识符
如何向串口读写数据
请问如何设置<em>串口</em>波特率,及向<em>串口</em><em>读写</em><em>数据</em>
请教串口读写丢失数据问题
使用一个定时器控制一个写线程不断发送字符,rn同时开了一个读线程。rn<em>问题</em>:rn当不段发送写字符<em>串口</em>1时rn再从另一端同时也通过<em>串口</em>1接受字符来读rn就会出现丢失<em>数据</em>情况rnrn请问是为什么?不是<em>串口</em>是全双工的么?各行其道?为何还会出现这样情况?rn以上都是异步rn
几个串口同时读写数据多线程问题
在程序中同时打开几个<em>串口</em>同时<em>读写</em><em>数据</em>,请问应该如何处理线程之间的关系?
c#串口多线程数据读写问题
设计一个<em>串口</em>的程序,硬件是USB转485的,要读出设备的<em>数据</em>并保存。rnrnSerialPort类有DataReceived事件,所以读<em>串口</em>可以不用自己设线程了。因为要经常询问以得到设备的<em>数据</em>,所以要重启一个线程去读。单不知如何实现?rnrn因为在询问<em>数据</em>时可能还会有其他的操作发出<em>串口</em>的命令,怎么样做才能避免相互的干扰?rnrn因为是485的,所以自己发出的<em>数据</em>也是能收到的,<em>数据</em>比较乱,不知如何分析取得的字符串?rnrn自己做了一点程序,在执行到join时总是死机。rnrn private void btnOpenPort_Click(object sender, EventArgs e)rn rn rn if (comport.IsOpen)rn rn comport.Close();rnrn getDataThread.Join();rn rn rn rn elsern rn comport.BaudRate = int.Parse(cmbBaudRate.Text);rn comport.DataBits = int.Parse(cmbDataBits.Text);rn comport.StopBits = (StopBits)Enum.Parse(typeof(StopBits), cmbStopBits.Text);rn comport.Parity = (Parity)Enum.Parse(typeof(Parity), cmbParity.Text);rn comport.PortName = cmbPortName.Text;rn comport.ReadTimeout = 500;rn comport.WriteTimeout = 500;rnrn tryrn rn comport.Open();rn getDataThread.Start();rn rn catch (Exception)rn rn MessageBox.Show("<em>串口</em>被占用!");rn rnrn rnrn EnableControls();rnrn if (comport.IsOpen) txtSendData.Focus();rn rnrn private void port_DataReceived(object sender, SerialDataReceivedEventArgs e)rn rn int bytes = comport.BytesToRead;rnrn byte[] buffer = new byte[bytes];rnrn comport.Read(buffer, 0, bytes);rnrn Log(LogMsgType.Incoming, ByteArrayToHexString(buffer));rn rnrn private void GetData()rn rnrn while (comport.IsOpen)rn rn byte[] data = HexStringToByteArray("FD 01 00 C8 00 FE");rnrn tryrn rn comport.Write(data, 0, data.Length);rn rn catch (Exception)rn rnrn MessageBox.Show("<em>数据</em>发送错误!控制器无响应!");rn rnrn Log(LogMsgType.Outgoing, ByteArrayToHexString(data) + "\n"); rn rnrn rn
串口读写问题
设备A通过485接线连接两个子设备A1和A2rnA要接收A1和A2的<em>数据</em>,如果是不同时间内的<em>数据</em>接收,那处理没<em>问题</em>。rn开一个线程,收到什么就处理什么。rnrn但是 当A1和A2同时发送<em>数据</em>至A的时候rn我想通过多线程让A接收, 可是领导说485是<em>串口</em>通讯,<em>串口</em>是串行的,无法并发rn所以要么接收到A1的<em>数据</em>,要么接收到A2的<em>数据</em>rn同时单独处理A1和A2的<em>数据</em>是不可能的rnrn请问他这个说法对吗?我不能收到A1+A2的一串<em>数据</em>吗?然后把它分解成A1和A2,再单独处理rnrnrnrn
读写串口问题
我这里有一个顾客显示屏,是证通ZT312型汉字顾客显示屏rn操作显示屏的方式是通过向<em>串口</em>发命令,我使用Delphi7.0做了个程序,使用了SPComm控件向<em>串口</em>发命令rn现在有以下两个<em>问题</em>:rn1、当我要在显示屏上显示三行文字rn如果我连续发三个命令:rn命令1;//显示第一行rn命令2;//显示第二行rn命令3;//显示第三行rn这时第三行就显示不出来rnrn如果我这样发命令:rn命令1;//显示第一行rn命令2;//显示第二行rnsleep(1000);rn命令3;//显示第三行rn这时第三行就可以正确显示出来rnrn请问这是为什么?rn注:以上的命令1,2,3都是用SPComm控件向<em>串口</em>发命令rnrn2、当比较连续(时间间隔较短)的向<em>串口</em>发送了多条显示命令后,显示屏会死机,不再对命令有反应,只能重新给显示屏上电后才能恢复正常,请问是为什么?
linux下串口读写问题
各位大虾:rn 小弟现在做<em>串口</em>通讯<em>问题</em>,是在linux环境下。rn 写<em>串口</em><em>数据</em>没有<em>问题</em>,因为我调用我的写<em>串口</em>程序,写入<em>串口</em><em>数据</em>后,在电脑的<em>串口</em>调试工具中能够看到我写的内容。但是我在调用我的<em>串口</em><em>数据</em>时发生了错误.rn 错误如下:rn [color=#FF0000] 在使用<em>串口</em>调试工具想<em>串口</em>发送<em>数据</em>时,在需要发送的<em>数据</em>前面 如果不加回车的话 无法读取<em>串口</em><em>数据</em>。必须在发送<em>数据</em>的前面加一个回车键 才可以。 真不知道怎么回事,都好几天了。代码如下[/color]rn 如果不加回车键 只能在 ioctl(fd,FIONREAD,&nbytes);//查询输入缓冲区中的字节数 中 输出缓冲区写入的字节大小 而读<em>串口</em>返回值确实0!!!rn int serialopen(char *device)rnrn rn int fd;rn struct termios tios;rn speed_t speed = B115200;rn if ((fd = open(device, O_RDWR|O_NOCTTY)) < 0)rn rn CALOG(">>>>>open serial device erro<<<<<>>>>cfsetospeed setting seer<<<<<>>>>cfsetispeed setting seer<<<<<>>>>>>>>>>tcsetattr setting erro<<<<<<<<<<<>>>>>>>>>nbytes = %d<<<<<<>>>>>>>>>rtrtrtr<<<<<<>>>>>>>>>nbyte[%d] = %d<<<<<<>>>>>>>>>ptr[0] = %d<<<<<<>>>>>>>>>ptt[%d] = %d<<<<<<>>>>>>>>>read serial erro<<<<<<>>>>>>>>>the data is null<<<<<<<>>>>>>>>>ptt[%d] = %d<<<<<<<>>>>>>>>>ptt = %s<<<<<<<,ptt);rn return count-1;rn 分数不多 还请各位大神帮帮忙啊
C#API读写串口问题
rn由于我需要在wince下运行,不能使用重叠功能,现在出现读一直挂起(没有读到<em>数据</em>时)rn[code=C#] //打开<em>串口</em>rn public int Com_Open(string ComSet, int BaudRate)rn rnrn int hCommFile;rn DCB dcb = new DCB();rn COMMTIMEOUTS TimeOuts = new COMMTIMEOUTS();rnrnrn hCommFile = CreateFile( ComSet,rn GENERIC_READ | GENERIC_WRITE,rn 0, //not sharedrn 0, //no security ??rn OPEN_EXISTING,rn 0,rn 0 );rnrn if(hCommFile == INVALID_HANDLE_VALUE)rn rn throw(new ApplicationException("Comm Port Can Not Be Opened"));rn rnrn // Is this a valid comm handle?rn if(GetFileType( hCommFile ) != FILE_TYPE_CHAR)rn rn CloseHandle( hCommFile );rn //throw(new ApplicationException("File handle is not a comm handle "));rn return INVALID_HANDLE_VALUE;rnrn rnrn if(!SetupComm( hCommFile, 4096, 4096 ))rn rn CloseHandle( hCommFile );rn //throw(new ApplicationException("Cannot setup comm buffer"));rn return INVALID_HANDLE_VALUE;rn rnrn // purge any information in the bufferrnrn PurgeComm( hCommFile, PURGE_TXABORT | PURGE_RXABORT |rn PURGE_TXCLEAR | PURGE_RXCLEAR ) ;rnrn // Setting the time-out valuern GetCommTimeouts( hCommFile, ref TimeOuts );rnrn // The CommTimeout numbers will very likely change if you arern // coding to meet some kind of specification wherern // you need to reply within a certain amount of time afterrn // recieving the last byte. However, If 1/4th of a secondrn // goes by between recieving two characters, its a goodrn // indication that the transmitting end has finished, evenrn // assuming a 1200 baud modem.rnrn TimeOuts.ReadIntervalTimeout=500;rn TimeOuts.ReadTotalTimeoutMultiplier=500;rn TimeOuts.ReadTotalTimeoutConstant=5000;rn TimeOuts.WriteTotalTimeoutMultiplier=500;rn TimeOuts.WriteTotalTimeoutConstant=5000;rnrn SetCommTimeouts(hCommFile, ref TimeOuts); // 设置超时rnrn // Configure the comm settings.rn // NOTE: Most Comm settings can be set through TAPI, but this means thatrn // the CommFile will have to be passed to this component.rn GetCommState(hCommFile, ref dcb);rnrn dcb.BaudRate = 28800;//BaudRate; // 波特率为rn dcb.ByteSize=8; // 每个字符有8位rn dcb.Parity = PAIRTY_EVEN; //奇偶校验rn dcb.StopBits=ONESTOPBIT; //一个停止位rn rn SetCommState(hCommFile, ref dcb);rn Opened = true;rn return hCommFile;rnrn rnrn //写<em>串口</em>rn public int ComReadFile(int ihCommFile, byte[] Readbuff, int ReadLen)rn rn if (ihCommFile != INVALID_HANDLE_VALUE)rn rn int NumberOfBytesTransferred = 0;rn OVERLAPPED ovlCommPort = new OVERLAPPED();rn if (ReadFile(ihCommFile, Readbuff, ReadLen, ref NumberOfBytesTransferred, ref ovlCommPort))//rn rn if (ReadLen == NumberOfBytesTransferred)rn rn return NumberOfBytesTransferred;rn rn else return NumberOfBytesTransferred;rnrn rn else return 0;rn rn else return 0;rn rn[/code]rn请问读,为何会挂起,我设置了超时,为何超时后不返回。我想超时后返回,如何写代码,注意,这是wince下使用,不是xp平台。
多线程串口读写问题???/????
先向<em>串口</em>写<em>数据</em>后要等待回应,大概200ms时间,如果无回应则要求用户重新写<em>串口</em>,若有回应则开始<em>串口</em>接收线程。这个过程怎样实现????rnrn等待<em>串口</em>回应是不是要设置一个定时器呢?rn等待回应是不是要单独一个线程呢?但是这个线程只需运行不到1秒的时间啊?怎么实现?rn谢谢!!!
Linux串口读写问题
大家帮忙看看以下<em>串口</em><em>读写</em>程序,我(pc机)给单片机发0x11单片机收到会发0x22过来,但是我有时候可以读到0x22有时读不到,那有<em>问题</em>?谢谢!rnrn#include rn#include rn#include rn#include rn#include rn#include rn#include rn#include rn#include rnrnint fd;rnrnint init_port()rnrn printf("init function begin\n");rn rn /*------------open the port-----------*/rn fd = open("/dev/ttyS0", O_RDWR | O_NOCTTY | O_NDELAY);rnrn if (-1 == fd)rn perror("Can't open serial port ");rn elsern printf("Open ttyS0\n");rnrn if(fcntl(fd, F_SETFL, 0) >= 0)rn printf("fcntl success!\n");rn elsern perror("fcntl ");rnrn if(isatty(STDIN_FILENO) == 0)rn printf("Standard input is not a terminal device\n");rn elsern printf("Isatty success!\n");rnrn printf("fd-open = %d\n", fd);rnrn /* set baud rate */rn struct termios oldtio, newtio;rnrn bzero(&oldtio, sizeof(oldtio));rn bzero(&newtio, sizeof(newtio));rn cfmakeraw(&newtio);rn rn //tcflush(fd, TCIOFLUSH);rnrn tcgetattr(fd, &oldtio);rnrn cfsetispeed(&newtio, B19200);rn cfsetospeed(&newtio, B19200);rnrn newtio.c_cflag |= CLOCAL; //rn newtio.c_cflag |= CREAD; //rn newtio.c_cflag &= ~CRTSCTS; //hardware flow controlrn newtio.c_cflag &= ~CSIZE; //rn newtio.c_cflag &= ~CSTOPB; //1 stop bitrn newtio.c_cflag &= ~PARENB; //Clear parity enablern newtio.c_cflag |= CS8; //8 bits datarnrn newtio.c_oflag &= ~OPOST;rn newtio.c_cc[VMIN] = 1; //min wait charsrn newtio.c_cc[VTIME] = 1; //wait timern tcflush(fd, TCIOFLUSH);rnrn tcsetattr(fd, TCSANOW, &newtio); //new setuprn tcgetattr(fd, &oldtio);rnrn printf("init function end\n\n");rn return 0;rnrnrnvoid read_serial()rnrn printf("read function begin\n");rnrn int len = 0;rn int buff[10];rn memset(buff, 0, 10);rnrn printf("fd = %d\n",fd);rnrn fd_set fs_read;rn FD_ZERO( &fs_read );rn FD_SET(fd, &fs_read);rn int fs_sel;rn struct timeval timeout;rn timeout.tv_sec = 5;rn timeout.tv_usec = 0;rnrn fs_sel = select(fd+1, &fs_read, NULL, NULL, &timeout);rn if(fs_sel)rn rn len = read(fd, buff, 1);rn perror("select"); rn printf("read nread = %d, 0x%2x\n", len, buff[0]);rn rn else if(fs_sel < 0)rn perror("select error");rnrn printf("buff = %s\n", buff);rn printf("no read nread = %d\n", len);rnrn printf("read function end\n\n");rnrnrnint write_serial(int data)rnrn printf("write function begin\n");rnrn int fs_sel;rn int len = 0;rn fd_set fs_write;rnrn FD_ZERO( &fs_write );rn FD_SET(fd, &fs_write);rnrn fs_sel = select(fd+1, NULL,&fs_write, NULL, NULL);rn rn if(fs_sel)rn rn len = write(fd, &data, 1);rn if(len == 1)rn rn printf("Send char 0x%2x to Comm\n", data);rn return len;rn rn elsern rn perror("PortSend write error");rn tcflush(fd, TCOFLUSH);rn printf("send data is = %d\n", data);rn return -1;rn rn rn else if(fs_sel);rn return 0;rn
串口读写格式问题
在vc里面,我想往<em>串口</em>写入一个字节,比如0x14的话,是不是我定义一个BYTE类型的变量rn如BYTE buf=20;然后用writefile( ,buf,)这个函数写到<em>串口</em>上,<em>串口</em>就能读出来这个字节是0x14??rn还是我必须要在writefile之前就先把十进制的20转化为0x14,然后在writefile呢,这两种方法,效果一样么?<em>串口</em>都是读到的0x14么?
linux串口读写问题
#define RSDEV_NAME "/dev/tts/0"rnrn/*rn*brief 设置<em>串口</em>通信速率rn*param fd 类型 int 打开<em>串口</em>的文件句柄rn*param speed 类型 int <em>串口</em>速度rn*return voidrn*/rnint speed_arr[] = B38400, B19200, B9600, B4800, B2400, B1200, B300,rn B38400, B19200, B9600, B4800, B2400, B1200, B300, ;rnint name_arr[] = 38400, 19200, 9600, 4800, 2400, 1200, 300, 38400, rn 19200, 9600, 4800, 2400, 1200, 300, ;rnvoid set_speed(int fd, int speed)rn int i; rn int status; rn struct termios Opt;rn tcgetattr(fd, &Opt); rn for ( i= 0; i < sizeof(speed_arr) / sizeof(int); i++) rn if (speed == name_arr[i]) rn tcflush(fd, TCIOFLUSH); rn cfsetispeed(&Opt, speed_arr[i]); rn cfsetospeed(&Opt, speed_arr[i]); rn status = tcsetattr(fd, TCSANOW, &Opt); rn if (status != 0) rn perror("tcsetattr fd1"); rn return; rn rn tcflush(fd,TCIOFLUSH); rn rn rnrnrn/**rn*brief 设置<em>串口</em><em>数据</em>位,停止位和效验位rn*param fd 类型 int 打开的<em>串口</em>文件句柄rn*param databits 类型 int <em>数据</em>位 取值 为 7 或者8rn*param stopbits 类型 int 停止位 取值为 1 或者2rn*param parity 类型 int 效验类型 取值为N,E,O,,Srn*/rnint set_parity(int fd,int databits,int stopbits,int parity)rn rn struct termios options; rn if ( tcgetattr( fd,&options) != 0) rn perror("SetupSerial 1"); rn return(FALSE); rn rn options.c_cflag &= ~CSIZE; rn switch (databits) /*设置<em>数据</em>位数*/rn rn case 7: rn options.c_cflag |= CS7; rn break;rn case 8: rn options.c_cflag |= CS8;rn break; rn default: rn fprintf(stderr,"Unsupported data size\n"); rn return (FALSE); rn rn switch (parity) rn rn case 'n':rn case 'N': rn options.c_cflag &= ~PARENB; /* Clear parity enable */rn options.c_iflag &= ~INPCK; /* Enable parity checking */ rn break; rn case 'o': rn case 'O': rn options.c_cflag |= (PARODD | PARENB); /* 设置为奇效验*/ rn options.c_iflag |= INPCK; /* Disnable parity checking */ rn break; rn case 'e': rn case 'E': rn options.c_cflag |= PARENB; /* Enable parity */ rn options.c_cflag &= ~PARODD; /* 转换为偶效验*/ rn options.c_iflag |= INPCK; /* Disnable parity checking */rn break;rn case 'S': rn case 's': /*as no parity*/ rn options.c_cflag &= ~PARENB;rn options.c_cflag &= ~CSTOPB;rn break; rn default: rn fprintf(stderr,"Unsupported parity\n"); rn return (FALSE); rn rn /* 设置停止位*/ rn switch (stopbits)rn rn case 1: rn options.c_cflag &= ~CSTOPB; rn break; rn case 2: rn options.c_cflag |= CSTOPB; rn break;rn default: rn fprintf(stderr,"Unsupported stop bits\n"); rn return (FALSE); rn rn /* Set input parity option */ rn if (parity != 'n' && parity != 'N') rn options.c_iflag |= INPCK; rn tcflush(fd,TCIFLUSH);rn options.c_cc[VTIME] = 30; /* 设置超时3 seconds*/ rn options.c_cc[VMIN] = 0; /* Update the options and do it NOW */rn /**rn *如果不是开发终端之类的,只是<em>串口</em>传输<em>数据</em>,rn *而不需要<em>串口</em>来处理,那么使用原始模式(Raw Mode)方式来通讯rn **/rn options.c_iflag &= ~(BRKINT | ICRNL | INPCK | ISTRIP | IXON | IXOFF | IXANY);rn options.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG |IEXTEN);rn options.c_oflag &= ~OPOST;rn rn if (tcsetattr(fd,TCSANOW,&options) != 0) rn rn perror("SetupSerial 3"); rn return (FALSE); rn rn return (TRUE); rnrnrn/**打开<em>串口</em>rn * dev <em>串口</em>设备名rn * mode 打开方式rn**/rnrnint opendev(char *dev,mode_t mode)rnrn int fd;rn fd = open(dev, mode); rn if (-1 == fd) rn perror("Can't Open Serial Port");rn return -1; rn rn elsern fcntl(fd, F_SETFL, FNDELAY);rn return fd;rn rnrn/********************************** input232.c 写<em>串口</em>********************************/rnrnrnvoid rs232_write(void)rnrn rn int rsfd = 0;rn int nwrite;rn char input_buf[64];rn rsfd = opendev(RSDEV_NAME,O_RDWR | O_NOCTTY | O_NDELAY);rn if(rsfd < 0)rn printf("open error:\n");rn return;rn rn set_speed(rsfd,9600); /*设置速率B9600*/rn if (set_parity(rsfd,8,1,'N') == FALSE) /*8位<em>数据</em>位,一位停止位*/rn printf("Set Parity Error\n");rn return;rn rn while(1) rn fgets(input_buf,sizeof(input_buf),stdin);rn printf("input_buf = %s", input_buf);rn nwrite = write(rsfd, input_buf, strlen(input_buf));rn if ( nwrite == -1 ) rn perror("ERROR!");rn exit(1);rn else rn printf("ret=%d\n", nwrite);rn rn rnrn/********************************** read232.c 读<em>串口</em>********************************/rnrnrnint read_rs232(int rsfd);rnvoid rs232_read(void)rnrn rn int rsfd = 0;rn// int nwrite;rn fd_set fdR;rn struct timeval timev;rn int n = 0;rn// char input_buf[64];rn rsfd = opendev(RSDEV_NAME,O_RDWR | O_NOCTTY | O_NDELAY);rn if(rsfd < 0)rn printf("open error:\n");rn return;rn rn set_speed(rsfd,9600); /*设置速率B9600*/rn if (set_parity(rsfd,8,1,'N') == FALSE) /*8位<em>数据</em>位,一位停止位*/rn printf("Set Parity Error\n");rn return;rn rn while(1) rn FD_ZERO(&fdR);rn FD_SET(rsfd, &fdR);rn timev.tv_sec = 0;rn timev.tv_usec = 100000;rn n = select(rsfd+1, &fdR, NULL, NULL, &timev);rn LOGMSG2("select ret %d", n);rn if(n 0)rn rn printf("nread:%d\n",nread);rn retbytes += nread;rn all_bytes += nread;rn rn return all_bytes;rnrnrn为什么rs232_read函数总是读取不到<em>数据</em>,在LOGMSG2("select ret %d", n);rn这里总是返回0????rn
多线程读写串口问题.....
[color=#FF0000]m_send="AT+CMGL=4\r"rnWriteFile(hCom,m_send,dwCount,&dwCount,NULL);rnchar ans1[1000];rnReadComm(ans1, 1000);rnrn.........[/color]rnrn这是线程1中执行的。rnrnrn[color=#0000FF]m_send="AT\r"rnWriteFile(hCom,m_send,dwCount,&dwCount,NULL);rnrnrnchar ans2[1000]; // 应答串rnrnReadComm(ans2, 1000);rnrnAfxMessageBox(ans2);[/color]rnrn这是线程2执行的。rnrn其实偶只想得到AT返回的OK结果,现在是多了,AT+CMGL=4后取得的结果.rnrn是否这样表述正确,就是怎么把rn"m_send="AT+CMGL=4\r"rnWriteFile(hCom,m_send,dwCount,&dwCount,NULL);rn""rn这一句的执行后的<em>串口</em><em>数据</em>清理干净。。rn
求救!串口读写问题
我写了一个<em>读写</em><em>串口</em>的程序,我往<em>串口</em>上写入一个命令,cts-2000就发送一批<em>数据</em>到<em>串口</em>,然后我的程序接收。<em>问题</em>是有的时候程序能正常运行,即发了命令就能接到<em>数据</em>,但有的时候却接不到<em>数据</em>。有时候把cts-2000重启就好了,有的时候重启多遍也没用。我想不明白这是为什么,难道是什么参数我没设????救命!!!!
急:读写串口问题
我是一个新手,想在vc或c中如何对<em>串口</em>操作?最好有源代码,如果觉得分数太少,可以在给!rn
串口读写超时问题
用SetCommTimeouts()设置完COMTIMEOUTS结构体,但是我如何能够得到<em>读写</em>超时的事件或回调函数呢?超时是怎么体现出来的呢?
关于串口读写问题
使用MSCOMM控件进行<em>读写</em>rn'发送控制命令rnPrivate Sub Command2_Click()rn With MSComm1rn .CommPort = 1rn .Settings = "9600,N,8,1"rn End Withrn If Not MSComm1.PortOpen Thenrn MSComm1.PortOpen = Truern Elsern MSComm1.PortOpen = Falsern MSComm1.PortOpen = Truern End Ifrn MSComm1.OutBufferCount = 0rn '要发送的命令串(16进制) AA050001000807D0FFFFrn Dim zl(19) As Bytern zl(0) = &HArn zl(1) = &HArn zl(2) = &H0rn zl(3) = &H5rn zl(4) = &H0rn zl(5) = &H0rn zl(6) = &H0rn zl(7) = &H1rn zl(8) = &H0rn zl(9) = &H0rn zl(10) = &H0rn zl(11) = &H8rn zl(12) = &H0rn zl(13) = &H7rn zl(14) = &HDrn zl(15) = &H0rn zl(16) = &HFrn zl(17) = &HFrn zl(18) = &HFrn zl(19) = &HFrn rnrn MSComm1.Output = zlrnrn MSComm1.InputLen = 0 '表示读出接受缓冲区中的所有<em>数据</em>rn MSComm1.RThreshold = 20 '20个字符产生一次接受事件rn MSComm1.Handshaking = comNone '<em>数据</em>流控制 没有rn 'MSComm1.InputMode = comInputModeText '表示读取文本内容rn MSComm1.InputMode = comInputModeBinary '表示二进制<em>数据</em>rn If MSComm1.InputMode = comInputModeText Thenrn readtype = 1rn Elsern readtype = 2rn End IfrnEnd Subrnrn'接受<em>数据</em>rnrnPrivate Sub MSComm1_OnComm()rn Dim buffer() As Bytern ReDim buffer(20)rn rn Text1 = ""rn Select Case MSComm1.CommEventrn Case comEvReceivern '字符读rn MSComm1.RThreshold = 0rn If readtype = 1 Thenrn MsgBox MSComm1.InBufferCountrn instring = MSComm1.Inputrn Text1 = instringrn Elsern '二进制读rn Do Until MSComm1.InBufferCount = 0rn buffer = MSComm1.Inputrn DoEventsrn Looprn rn For i = 0 To 19rn List1.AddItem (Hex(buffer(i)))rn Next irn End Ifrn MSComm1.InBufferCount = 0rn MSComm1.RThreshold = 24rn Beeprn End SelectrnEnd Subrnrn现在的<em>问题</em>是发送该控制指令后,读出的<em>数据</em>显示该控制指令错误,请高手指正rn
关于串口读写问题
1.本规约物理层采用EIA标准RS-232或RS-485异步串行接口,疵点记录仪配置rn485-232转换器,串行通信接口参数要求:rn波特率:19200bps;rn<em>数据</em>为:8,停止位:1,检验位:无.rn2.疵点记录仪和主机之间采用半双工方式,每次通信都是由主机发送通信命令到疵点记录仪,疵点记录仪根据收到的命令作出相应的响应,疵点记录仪收到命令帧的响应延时应小于0.5秒.rn3.主机发送到疵点记录仪的命令帧格式为rn 启动字符55Hrn 启动字符AAHrn 命令码02Hrn 0H(忽略)rn 0H(忽略)rn 校验码rn4.疵点记录仪发送到主机的<em>数据</em>帧格式为:rn 启动字符55H(1字节)rn 启动字符AAH(1字节)rn 状态码(1字节)rn 帧长度(1字节)rn <em>数据</em>域(0-N字节)rn 校验码(1 字节)rn5.[color=#FF0000]校验码是从启动字符开始到校验码之前的所有各字节二进制算术和(不计超过256的溢出值)[/color]rn我用的是vs2005自带的<em>串口</em>控件,rn port.BaudRate = 19200;//波特率rn port.DataBits = 8;//8位<em>数据</em>位rn port.Parity = Parity.None;//无校验位rn port.StopBits = StopBits.One;//1为停止位rn port.PortName = "COM1";rn port.Open();rnrn byte[] a = new byte[4];rn a[0] = 0x55; //启动字符55Hrn a[1] = 0xAA; //启动字符AAHrn a[2] = 0x02; //命令吗02Hrn a[3] = 0x01; //校验码(从启动字符开始到校验码之前的所有各字节二进制算术和),就是我上次要你算出来的结果rn port.Write(a, 0, a.Length);//[color=#FF0000]主机往疵点记录仪发送命令帧?就是a里面的值不知道是不是这么写的[/color]rnrn textBox2.Text = port.ReadLine();//读取从疵点返回过来的<em>数据</em>。?当疵点记录仪没有<em>数据</em>发过来,程序就卡在这里了,程序就一直等待<em>数据</em>发过来,,rn port.Close();rnrn各位老大,帮我看看,就是往疵点记录仪写的时候byte[] a里面不知道写的正确否。rnrnrnrnrnrn
串口异步读写问题
DWORD WINAPI SerialPort1ThreadProcess( HWND hWnd) //主窗口句柄rnrn DWORD dwEvtMask = 0;rn OVERLAPPED osRead = 0;rn CSerialPortAPIDlg *pdlg = (CSerialPortAPIDlg*)CWnd::FromHandle(hWnd);rn WaitCommEvent(pdlg->hCom, &dwEvtMask, &osRead);rn SetCommMask(pdlg->hCom, EV_RXCHAR| EV_TXEMPTY);rn if((dwEvtMask&EV_RXCHAR)==EV_RXCHAR)rn rn COMSTAT comstat;rn DWORD dwlength;rn DWORD dwbytesread; //读取的字节数rn DWORD dwerror;rn DWORD *lpRead=NULL;rn DWORD dwerrorflags;rn ClearCommError(pdlg->hCom, &dwerrorflags, &comstat);rn dwlength = comstat.cbInQue;rn if(dwlength>0)rn rn BOOL freadstat;rn freadstat = ReadFile(pdlg->hCom, lpRead, dwlength, &dwbytesread, &osRead);rn if(! freadstat) rn rn if(GetLastError()==ERROR_IO_PENDING)rn rn while(!GetOverlappedResult(pdlg->hCom, &osRead, &dwbytesread, true))rn rn dwerror=GetLastError();rn if(dwerror==ERROR_IO_INCOMPLETE)rn continue;rn ::PostMessage((HWND)hWnd, COM_RECVDATA, (unsigned int)lpRead, dwbytesread);rn rn rn rn rn rn return true;rnrnrnrn初学,现在程序编译通过,但是<em>读写</em>还是不成功,郁闷,因为比较急就请大家帮下忙,谢谢!
串口读写问题请教
LInux下面我写了一个写<em>串口</em>的函数,一直往<em>串口</em>写字符串“this is a test”,然后通过<em>串口</em>调试工具看输出的内容,开始还是正确的,可是后来就不对了,请大哥给予小弟指点,谢谢!rnrn代码如下:rnrnopen_port(const char *port_p)rnrn int fd; rnrn rn fd=open(port_p,O_RDWR|O_NONBLOCK);rn rn if(fd==-1)rn perror("Open port: Unable to open the serial port\n");rn return 0;rn rn rnrn return fd;rnrnrnrnrnint fdcom2;rnfdcom2=open_port("/dev/ttyS1");rnwhile(1)rnwrite(fdcom2, "this is a test\n",strlen("this is a test\n") );rnrnrnrn
linux串口读写问题
我的代码如下,请各位帮我看看为什么接受<em>数据</em>的时候分段接收,我给它发的是“0003468055”他的接受结果是这样的rnopen ttyS0...rnnread=8rnbuff=0003468rnnread=6rnbuff=005rn我想应该是我程序的<em>问题</em>请大家帮忙看看,下面我把程序给大家发一下:rnint speed_arr[]=B38400,B19200,B9600,B4800,B2400,B1200,B300,B38400,B19200,B9600,B4800,B2400,B1200,B300,B115200;rnint name_arr[]=38400,19200,9600,4800,2400,1200,300,38400,19200,9600,4800,2400,1200,300,115200;rnrnrnrnint open_port(int fd,int comport)rnrn if(comport==0)rn rn fd=open("/dev/ttyS0",O_RDONLY|O_NOCTTY);rn if(-1==fd)rn rn perror("Can't open serial port0 ");rn return (-1);rn rn elsern printf("open ttyS0........\n");rn rn else if(comport==1)rn rn fd=open("/dev/ttyS1",O_RDWR|O_NOCTTY|O_NDELAY);rn if(-1==fd)rn rn perror("can`t open serial port1 ");rn return (-1);rn rn elsern printf("open ttyS1......\n");rn rn else if(comport==2)rn rn fd=open("/dev/ttyS2",O_RDWR|O_NOCTTY|O_NDELAY);rn if(-1==fd)rn rn perror("can`t open serial port2");rn return -1;rn rn elsern printf("open ttyS2.......\n");rn rn else if(comport==3)rn rn fd=open("/dev/tts/3",O_RDWR|O_NOCTTY|O_NDELAY);rn if(-1==fd)rn rn perror("can't open serial port3");rn return -1;rn rn elsern printf("open ttyS3........\n");rn rn else if(comport==4)rn rn fd=open("/dev/tts/4",O_RDWR|O_NOCTTY|O_NDELAY);rn if(-1==fd)rn rn perror("can`t open serial port3");rn return -1;rn rn elsern printf("open ttyS4.....\n");rn rn return fd;rnrnrnint port_init(int fd,int speed,int databits,int stopbits,int parity)rnrn int i;rn int status;rn struct termios opt;rn tcgetattr(fd,&opt);rn for(i=0;i=10)rn rn printf("buff=%s\n",buff);rn rn memset(buff,NULL,sizeof(buff)); rn rnrn请大家帮我看看,到底那个地方设置错误,倒置的这样的结果,
wince5.0串口读写问题
我要在wince5.0上实现一个<em>串口</em>转发的程序,就是将一个COM7上收到的<em>数据</em>转发到COM6,COM6收到的<em>数据</em>转发到COM7,一个字节一个字节转发就可以,但非常的慢,我用SetCommMask(),WaitCommEvent(),ClearCommError(),这几个函数,就不起作用<em>串口</em>的<em>数据</em>有时候会接收不到,谁有什么好办法么? rn我把实现的代码贴出来:rn[code=C/C++]rn//我把<em>串口</em>的打开和线程的创建放在初始化函数中rnBOOL CTransServiceDlg::OnInitDialog()rnrn CDialog::OnInitDialog();rnrn // Set the icon for this dialog. The framework does this automaticallyrn // when the application's main window is not a dialogrn SetIcon(m_hIcon, TRUE); // Set big iconrn SetIcon(m_hIcon, FALSE); // Set small iconrn rn CenterWindow(GetDesktopWindow()); // center to the hpc screenrnrn // TODO: Add extra initialization herern pDlg = this ;rnrnrn Stat = m_com7.SerOpen(EXTERNAL_COMPORT, 115200, NOPARITY, 8);rn sbuf.Format(L"open return: %02x",Stat);rn pDlg->m_EditResp.ReplaceSel(sbuf);rn rn if(Stat != 0)rn rn sbuf.Format(L"open port 7 failed");rn pDlg->m_EditResp.ReplaceSel(sbuf);rn rn Stat = m_com6.SerOpen(USIP_COMPORT, 115200, NOPARITY, 8);rn sbuf.Format(L"open return: %02x",Stat);rn pDlg->m_EditResp.ReplaceSel(sbuf);rn rn if(Stat != 0)rn rn sbuf.Format(L"open port 6 failed");rn pDlg->m_EditResp.ReplaceSel(sbuf);rn rnrn h_usip_sr = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)usip_SendReceive,rn NULL, 0, &dwThreadId_h_usip_sr); rn if(!h_usip_sr)rn AfxMessageBox(_T("usip send receive线程创建失败"));rn h_pda_sr = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)pda_SendReceive,rn NULL, 0, &dwThreadId_h_pda_sr); rn if(!h_pda_sr)rn AfxMessageBox(_T("usip send receive线程创建失败"));rnrn return TRUE; // return TRUE unless you set the focus to a controlrnrnrn//com6转发到com7rnvoid WINAPI usip_SendReceive(LPVOID lpParam)rnrn rn#if 0rn//这里原来是一个字节一个字节转发的 可以实现但非常的慢rn BYTE ch,iret;rn while(1)rn rn rn iret = m_com6.ReceiveByte(&ch, 20);rn if(iret!=0) rn rn Sleep(1);rn continue;rn rn //Lib_Lcdprintf(" -%c- ",ch);rn m_com7.SerWrite(&ch,1,20);rn rn#elsern//这里后来改的 看看有什么<em>问题</em>没有rn COMSTAT cmState;rn DWORD evtMask=0;rn DWORD dwReadErrors;rn int iret ;rn int temp;rnrn SetCommMask(m_com6.m_CommPort, EV_RXCHAR);rn rn byte buff[4096];rn memset(buff,0x00,4096);rn m_com6.ResetPort();rn while(TRUE)rn rn Sleep(1);rn if(WaitCommEvent(m_com6.m_CommPort,&evtMask,NULL))rn rn ClearCommError(m_com6.m_CommPort,&dwReadErrors,&cmState);rn if (cmState.cbInQue >0)rn rn temp = cmState.cbInQue;rn iret = m_com6.SerRead(buff,temp,20);rn //SaveSend(buff, temp); rn iret = m_com7.SerWrite(buff,temp,20);rn memset(buff,0x00,4096);rn rn rn rn#endifrnrnrnrn//com7转发到com6rnvoid WINAPI pda_SendReceive(LPVOID lpParam)rnrnrn#if 0rn BYTE ch,iret;rn while(1)rn rn iret = m_com7.ReceiveByte(&ch, 20);rn if(iret!=0)rn rn Sleep(1);rn continue;rn rnrn m_com6.SerWrite(&ch,1,20);rn rn#elsern COMSTAT cmState;rn DWORD evtMask=0;rn DWORD dwReadErrors;rn int temp;rn int iret ;rn rn SetCommMask(m_com7.m_CommPort, EV_RXCHAR );rn rn byte buff[4096];rn memset(buff,0x00,4096);rnrn while(TRUE)rn rn Sleep(1);rn if(WaitCommEvent(m_com7.m_CommPort,&evtMask,NULL))rn rn ClearCommError(m_com7.m_CommPort,&dwReadErrors,&cmState);rn if (cmState.cbInQue > 0)rn rn temp = cmState.cbInQue;rn iret = m_com7.SerRead(buff,temp,20);rn iret = m_com6.SerWrite(buff,temp,20);rn memset(buff,0x00,1024);rn rn rn rnrnrn#endifrnrnrnrnrnrnrnrnrnrn[/code]
C#的串口读写问题
请问如何在c#中读取<em>串口</em>??有没有什么源码??
求救串口读写问题
各位高手:rnrn本人用PB4.2建造了一个CEPC WEBPAD,并编程进行<em>串口</em><em>读写</em>操作,现遇到一奇怪<em>问题</em>:rn对<em>串口</em><em>读写</em>,但<em>串口</em>无反应.rnrn我对<em>串口</em>的设置是:rn hLocal = CreateFile (TEXT("COM1:"),rn GENERIC_READ | GENERIC_WRITE,rn 0, rn NULL,rn OPEN_EXISTING, rn 0, rn NULL);rnrn DCB dcb;rnrn dcb.DCBlength = sizeof (DCB);rn GetCommState (hLocal, &dcb);rn dcb.BaudRate = 2400;//nSpeed; //2400 baudratern dcb.fBinary = TRUE;rn dcb.fParity = TRUE;rn dcb.fOutxCtsFlow = FALSE; // No CTS output flow controlrn dcb.fOutxDsrFlow = FALSE; // No DSR output flow controlrn dcb.fDtrControl = DTR_CONTROL_ENABLE;rn dcb.fDsrSensitivity = FALSE; // DSR sensitivity rn dcb.fTXContinueOnXoff = TRUE; // XOFF continues Tx rn dcb.fOutX = FALSE; // No XON/XOFF out flow control rn dcb.fInX = FALSE; // No XON/XOFF in flow control rn dcb.fErrorChar = FALSE; // Disable error replacement. rn dcb.fNull = FALSE; // Disable null stripping. rn dcb.fRtsControl = RTS_CONTROL_ENABLE; rn // RTS flow control rn dcb.fAbortOnError = FALSE; // Do not abort reads/writes on rn dcb.ByteSize = 8;rn dcb.StopBits = ONESTOPBIT;rn dcb.Parity = NOPARITY;rn SetCommState (hLocal, &dcb);rnrn COMMTIMEOUTS cto;rn cto.ReadIntervalTimeout = 0;rn cto.ReadTotalTimeoutMultiplier = 0;rn cto.ReadTotalTimeoutConstant = 0;rn cto.WriteTotalTimeoutMultiplier = 0;rn cto.WriteTotalTimeoutConstant = 0;rn rn SetCommTimeouts (hLocal, &cto);rnrn EscapeCommFunction (hLocal, CLRIR);rnrn然后创建两个THREAD对<em>串口</em><em>读写</em>:rnrc = ReadFile (hLocal, &Byte, 1, &cBytes, NULL);rnDEBUG可看到:rnrc = 1;cBytes = 0;也就是没读到<em>数据</em>,可我正往<em>串口</em>送<em>数据</em>;rnrnrc = WriteFile (hLocal, &Byte, 1, &cBytes, NULL);rnDEBUG可看到:rnrc = 1;cBytes = 1;也就是正确的写入一个数,可我示波器在<em>串口</em>看不到波型.rnrn不知各位是否也遇到这奇怪<em>问题</em>.我已搞了三天了,只好求救各位了.多谢!rnrn另我在WIN2000下用VC也是用以上的方法编程对以上说的同一<em>串口</em><em>读写</em>操作,但能正确<em>读写</em>操作.rnrnrnrnrnrnrn
DOS下串口读写问题
我在DOS下用inportb() 收0x00 - 0x0F这几个数的时候怎么总是不对啊?收大于0x0F的数都可以。rn是什么原因呢?
读写串口问题!!!!
利用WIN32通信的API在同步执行时,函数直到操作完成后才返回,这意味着在同步执行时线程被阻塞。在执行时,即使操作还未完成,调用的函数也会立即返回。费时的I/O操作在后台进行。这样一来,线程就可以做其它的工作。rnrnrn上面的一段话不是很明白!!!!rn在<em>读写</em><em>串口</em>时 ,同步执行,异步执行指什么?????
请教读写串口问题
ReadFile(h_Com,buff,length,&length,NULL);rn请问这句话是什么意思?rn是不是把<em>串口</em>h_Com中的<em>数据</em>读到buff中去?rn我想把读入的<em>数据</em>用一个数组存起来,还想对其进行操作;比如,对某些位的不同值,给出不同的解释;rn请问:rn我该怎么才能把他们用一个数组存起来?
串口读写问题,求助
我的<em>串口</em>这样写的, unsigned short port=0;rn HANDLE m_com1=0;rn CString port_name="COM1";rn m_com1=CreateFile(port_name,GENERIC_READ|GENERIC_WRITE,rn 0,NULL,rn OPEN_EXISTING,rn FILE_FLAG_OVERLAPPED,rn NULLrn );rn rn SetupComm(m_com1,// handle of communications device rn 4000, // to set size of input buffer rn 500); // // size of output buffer rn DCB m_dcb;rn GetCommProperties(m_com1,&m_comm_prop);rn GetCommState(m_com1,&m_dcb);rn if (m_comm_prop.dwSettableBaud & BAUD_19200)rn m_dcb.BaudRate=19200;rn rn m_dcb.fBinary=TRUE;rn m_dcb.fParity=TRUE;rn m_dcb.fDtrControl=DTR_CONTROL_DISABLE;rn rn m_dcb.fNull=TRUE;rn m_dcb.wReserved=0;rn m_dcb.fRtsControl=RTS_CONTROL_DISABLE;rn m_dcb.ByteSize=8;rn m_dcb.Parity=ODDPARITY;rn m_dcb.StopBits=ONESTOPBIT;rn SetCommState(m_com1,&m_dcb); rnrn GetCommTimeouts(m_com1,&m_time_out);rn m_time_out.ReadIntervalTimeout=2;rn m_time_out.ReadTotalTimeoutConstant=50;rn m_time_out.WriteTotalTimeoutMultiplier=0;rn m_time_out.WriteTotalTimeoutConstant=50;rn rn SetCommTimeouts(m_com1,&m_time_out);rn SetCommMask(m_com1,0); rn不知道什么原因,我的程序收不到00,我用我的<em>串口</em>调试助手可以收到,但是运行完程序就收不到了rn请各位高手帮我看看
读写串口
为什么在写入<em>串口</em>之后打印机可以打印出来可是用ReadFile确读不出来,一直显示的设备长度为0?
串口读写
uart.c该源码实现了用Linux对<em>串口</em>的<em>读写</em>操作
串口读写
我想做一个<em>串口</em>通讯程序与单片机通讯,但有些功能...rn1.往<em>串口</em>写入16进制数:7D 80 81 02该如何操作?rn2.读<em>串口</em>的<em>数据</em>,如何将其转化为16进制数以及ASCII码?
wince串口读写读写时间
1.打开<em>串口</em> OpenPort() { //主要是CreateFile()函数,外加<em>串口</em>的一些参数初始化 hCEComm = CreateFile&#40; L"COM1:", GENERIC_READ | GENERIC_WRITE, //允许读和写 0, //独占方式(共享模式) NULL, OPEN_EXISTING, //打开而不是创建(创建方式) 0, NULL &#41;; //设置<em>串口</em>事件 //设置<em>串口</em><em>读写</em>时间 COMMTIMEOUTS CommTimeOuts; GetCommTimeouts (hCEComm, &CommTimeOuts;); CommTimeOuts.ReadIntervalTimeout = 5; CommTimeOuts.ReadTotalTimeoutMultiplier = 0; CommTimeOuts.ReadTotalTimeoutConstant = 0; CommTimeOuts.WriteTotalTimeoutMultiplier = 50; CommTimeOuts.WriteTotalTimeoutConstant = 2000; if(!SetCommTimeouts( hCEComm, &CommTimeOuts; )) { TRACE( _T("SetCommTimeouts 返回错误") ); //关闭<em>串口</em> CloseHandle (hCEComm); hCEComm = INVALID_HANDLE_VALUE; return FALSE; } //指定端口监测的事件集
串口读写小工具—设置串口,对串口读写
<em>串口</em>小工具,<em>读写</em><em>串口</em>。可对<em>串口</em>,波特率,<em>数据</em>位,停止位,校验位进行设置
EVC 串口读写问题
请问下我照着《EVC高级编程及其应用开发》的<em>串口</em>通信类,然后在对话框中加入一个打开<em>串口</em>和写<em>串口</em>的按钮,打开<em>串口</em>成功,但是写<em>串口</em>的时候会出<em>问题</em>,应该是在WriteThreadFunc函数中,也就是写线程,运行一段时间后会出现Unhandled exception at 0x00000000,我想请问是什么原因,然后最后那句mySeries->m_hWriteThread = NULL;把线程置空是什么意思,谢谢!
请教串口红外的读写问题
rn编程环境:VC6.0 编程语言:C++rnrn用<em>串口</em>红外适配器向带有红外接口的手机传<em>数据</em>,需要自己写红外的传输协议么?rn不写红外的传输协议的话怎么才能接收和发送!rnrn请教高人!
串口读写问题.readfile延时
我写了一个com通讯的mfc 的dll(便于测试),在测试过程中遇到了一个<em>问题</em>:如果我在写完成的时候设定了一个对话框.告诉我们写入成功,确定后执行读操作,在vc的平台上面发现返回值正确,读到<em>数据</em>长度为20(用ClearCommError得到).然后将对话框去掉再次调用却发现没有读入任何<em>数据</em>.然后在ClearCommError后面添加对话框得到长度为0.这让我好郁闷.rnrn是不是readfile读的太早了,使得还没有返回值的时候就读了,但这好像不对rn如果不是,难道readfile读迟了,但是那样的结果是添加对话框反而使得时间间隔更长,rn更加不可能读出什么东西来呀!!rnrnrn是不是设置的SetCommTimeouts参数不对,还是怎样.rn期待大家的解答,我现在好郁闷..
关于串口读写的简单问题
我最近正在学习<em>串口</em>的<em>读写</em>,按照csdn上的介绍,我createfilernrn然后writefile,rn但在writefile时候老是不能返回值,程序便没有反应了,但我要是把rn第二个参数字符串指针或第四个参数已写入字符串字数之中任意一个设成NULLrn便可以了,但那样似乎就没有什么意义了。rnrn希望的得到回答,晚些时候我会将那段程序写上rnrn谢谢帮忙
串口读写问题(高分相送)
我有一个程序,是对<em>串口</em>进行操作的。现在的<em>问题</em>是:当一个外部设备发送字符串过来的时候,我的程序中的一个线程要去读取<em>串口</em>中的内容。但是我发现,有时候外部设备没有发送完,我的线程就已经可以读取其中的内容了。而我要求必须外部设备发送完了才可以进行读取操作。现在关键是不好掌握外部设备的状态。各位有什么好的方法可以解决这个<em>问题</em>么?
初学遇到的串口读写问题!
刚开始学习C#,最近要用蓝牙连接PC,需要用到虚拟<em>串口</em>,想用SerialPort这个类实现,但是当调用SerialPort.readline的时候程序就死,readexisting读出的是空,应该是writeline有<em>问题</em>,<em>数据</em>没有发送出去。rnrn public SerialPort port = new System.IO.Ports.SerialPort("COM6");rn rn InitializeComponent();rn rn rn private void Form1_Load(object sender, EventArgs e)rn //对<em>串口</em>进行设置 rnrn port.PortName = SerialPort.GetPortNames()[0];//第一个可用端口 rn port.Parity = Parity.None;rn port.Handshake = Handshake.None;rn port.BaudRate = 9600;rn port.DataBits = 8;rn port.ReadTimeout = 50;rn port.WriteTimeout = 50;rn rnrnrnrn private void button1_Click(object sender, EventArgs e)rn rn tryrn rn port.Open();rn label1.Text = port.PortName+ "打开成功";rnrn rn catchrn rnrn label1.Text = port.PortName.ToString() + "打开失败";rn rnrn rn private void button2_Click(object sender, EventArgs e)rn rn tryrn rnrn // read.Join(); rn port.Close();rn label1.Text = port.PortName.ToString() + "关闭成功";rn rn catchrn rnrn label1.Text = port.PortName.ToString() + "关闭失败";rn rn rnrnrnrn private void read_Click(object sender, EventArgs e)rn rn string data;rn tryrn rn data = port.ReadLine();rn MessageBox.Show(data);rn rn catchrn rn MessageBox.Show("failed");rn rn rn//写<em>数据</em>rn private void button1_Click_1(object sender, EventArgs e)rn rn string message = "test";rn port1.Write(message);rn rnrn一个最简单的程序,端口打开成功,就是<em>数据</em>传的时候失败。程序放在两台PC上,蓝牙连接的时候显示所使用的COM不一样:一个是COM4,一个是COM6。相应的,在程序里我把PortName改过之后再生成新的程序,但是<em>读写</em>依然错误。是不是PortName的地方设错了?另外<em>串口</em>程序能在同一台机子上测试吗?老是用两台有点麻烦rnrn谢谢各位了rnrn
请教一个串口读写问题
我想用ARM去控制一个GPRS模块,他们之间通过<em>串口</em>通信rn控制器发送字符AT,模块会响应AT OKrn现在<em>问题</em>是:rn我发送了AT后,模块需要时间相应指令rn如果马上read,就会出现没有读完全响应内容的情况rn请问该怎样处理这种情况?最好不要用延时解决rn
关于串口的同时读写问题.
我通过用hnewcommfilewrite:=createfile('com2',generic_write,0,nil,open_existing,rn file_flag_overlapped,0);rn和hnewcommfileread:=createfilern('com2',generic_read,0,nil,open_existing,rn file_flag_overlapped,0);rn分别创建对于<em>串口</em>的<em>读写</em>句柄,而且在读的时候还另外创建一个线程.rn但是如果我在读的时候再去通过hnewcommfilewrite:=createfile('com2',generic_write,0,nil,open_existing,rn file_flag_overlapped,0);rn去获取<em>串口</em>写的句柄时就不行.就算我把其中的共享模式由0改为1也不行.rn除非我先用closehandle(hnewcommfileread)关闭读句柄时才行,但这样的话读的进程也就不会执行.不知是createfile这个API函数使用有误还是本身流程方法有误?望指点.rn如能提供关于同时<em>读写</em>的例程将不甚感激.rnouyaning@bosind.com.cn
一个关于串口读写问题.
我在编写一个<em>串口</em>通信的程序中遇到了<em>问题</em>,请高手指点。rn这是一个辅助线程,rnUINT ComPro(LPVOID pParam)rnrn TRACE("ComPro()\n");rn OVERLAPPED os;rn DWORD dwMask,dwTrans;rn COMSTAT ComStat;rn DWORD dwErrorFlags;rn CSerialPortDoc* pDoc=(CSerialPortDoc*) pParam;rn memset(&os,0,sizeof(OVERLAPPED));rn os.hEvent=CreateEvent(NULL,TRUE,FALSE,NULL);rn if(os.hEvent==NULL)rn rn AfxMessageBox("Can't creat event object");rn return (UINT)-1;rn rnrn while(pDoc->m_bConnected)rn rn if(!::ClearCommError(pDoc->m_hCom,&dwErrorFlags,&ComStat))rn TRACE("ClearCommError--failed\n");rn TRACE("ComStat.cbInQue=%d\n",ComStat.cbInQue);rn if(ComStat.cbInQue)rn rn TRACE("ComStat.cbInQue\n");rn TRACE("READY TO POSTMESSAGE\n");rn WaitForSingleObject(pDoc- >m_hPostMsgEvent,INFINITE);rn ::ResetEvent(pDoc->m_hPostMsgEvent);rn TRACE("PostMessage\n");rn ::PostMessage(pDoc->m_hTermWnd,WM_COMMNOTIFY,EV_RXCHAR,0);rn continue;rn rn dwMask=0;rn TRACE("WaitCommEvent()\n");rn //////////////////////////////////////////////////////////////////////rn if(!WaitCommEvent(pDoc->m_hCom,&dwMask,&os))rn rn if(GetLastError()==ERROR_IO_PENDING)rn rn TRACE("Thread::GetOverlappedResult()begin\n");rn ::GetOverlappedResult(pDoc->m_hCom,&os,&dwTrans,TRUE);//********************rn TRACE("Thread::GetOverlappedResult()returned\n");rn rn elsern rn CloseHandle(os.hEvent);rn TRACE("return -1\n");rn return (UINT)-1;rn rn rn rn ///////////////////////////////////////////////////////////////////////////////rn ::CloseHandle(os.hEvent);rn return 0;rnrn在主程序中有SetCommMask(m_hCom,EV_RXCHAR);及SetupComm(m_hCom,1024,1024);rnrn程序运行到******处,好像就被阻塞了,debug时只有Thread::GetOverlappedResult()begin而无Thread::GetOverlappedResult()returned。而如果我把********这行注释掉的话,则直接进入else程序段,而结束线程。这一点我就不明白,WaitCommEvent()没有立即返回,怎么会由后面的代码而决定GetLastError()的返回值呢?rnrn另外,用SetupComm()来设置缓存就可以了吗?不需要其他的工作,WriteFile和ReadFile就能<em>读写</em>缓存了吗?rnrn对于SetCommMask()和WaitCommEvent(HANDLE hFile, LPDWORD lpEvtMask, OVERLAPPED lpOverlapped)我理解的不是很清晰,我的个人理解是:SetCommMask()指定要通知的事件,而WaitCommEvent()等待指定的事件发生,指定的事件发生后,OVERLAPPED结构的hEvent被置为有信号,但是LPDWORD lpEvtMask的作用我不太明白,他是只指示被指定的事件,还是指示所有事件如果多个事件同时发生,它的值又是什么rn呢?rnrnrnrnrn
请问串口读写问题(WINCE)
<em>串口</em>的接收方式中我使用的是一线程!下面是该是接收的线程函数! rn//<em>串口</em>读线程函数rnDWORD CCESeries::ReadThreadFunc(LPVOID lparam)rnrn CCESeries *ceSeries = (CCESeries*)lparam;rn DWORD evtMask;rn BYTE * readBuf = NULL;//读取的字节rn DWORD actualReadLen=0;//实际读取的字节数rn DWORD willReadLen;rn rn DWORD dwReadErrors;rn COMSTAT cmState;rn rn // 清空缓冲,并检查<em>串口</em>是否打开。rn ASSERT(ceSeries->m_hComm !=INVALID_HANDLE_VALUE); rn rn rn //清空<em>串口</em>rn PurgeComm(ceSeries->m_hComm, PURGE_RXCLEAR | PURGE_TXCLEAR );rnrn SetCommMask (ceSeries->m_hComm, EV_RXCHAR);// | EV_CTS | EV_DSR );rn while (TRUE)rn rn if (WaitCommEvent(ceSeries->m_hComm,&evtMask,0))rn rn SetCommMask (ceSeries->m_hComm, EV_RXCHAR);// | EV_CTS | EV_DSR );rn //表示<em>串口</em>收到字符 rn if (evtMask & EV_RXCHAR) rn rn rn ClearCommError(ceSeries->m_hComm,&dwReadErrors,&cmState);rn willReadLen = cmState.cbInQue ;rn if (willReadLen m_hComm, readBuf, willReadLen, &actualReadLen,0);rn rn //如果读取的<em>数据</em>大于0,rn if (actualReadLen>0)rn rn //触发读取回调函数rn ceSeries->m_OnSeriesRead(ceSeries->m_pPortOwner,readBuf,actualReadLen);rn rn rn rn //如果收到读线程退出信号,则退出线程rn if (WaitForSingleObject(ceSeries->m_hReadCloseEvent,500) == WAIT_OBJECT_0)rn rn break;rn rn rn return 0;rnrnrn但在使用ClearCommError(ceSeries->m_hComm,&dwReadErrors,&cmState);时出现cmState.cbInQue的值有<em>问题</em>,所以接收到很多乱吗!请高手指点
一个串口读写的奇怪问题
各位大虾:rn 我现在要做一个<em>串口</em>通讯<em>问题</em>,rn BYTE *RecvBuffer;rnrn RecvBuffer=(BYTE *)malloc(sizeof(BYTE)*4);rn Ret=ReadFile(hDevice,RecvBuffer,4,&FactRead,NULL);rn if (Ret==FALSE)rn rn free(RecvBuffer);rn return (ReceiveE);rn rn本来底层给我发的<em>数据</em>预期是:RecvBuffer[0]=0x11;RecvBuffer[1]=0x22;rn RecvBuffer[2]=0x33;RecvBuffer[3]=0x44;rn而我受到的却是:rn RecvBuffer[0]=0x11223344;而RecvBuffer[1],RecvBuffer[2],rn RecvBuffer[3]特别奇怪,为何?先谢rnrn
关于多线程读写串口问题
谁能提供一个用API函数实现的例子,谢谢!
mscomm控件读写串口问题
我在用mscomm控件<em>读写</em><em>串口</em>的同时,如果打开一个比较大的程序,则<em>读写</em>的<em>数据</em>通常会出错,(和<em>串口</em>的通讯规约是做单片机的人写的),估计是规约的原因还是系统的<em>问题</em>还是单片机的<em>问题</em>?谢谢
用java读写串口问题
我怎么才能实现对<em>串口</em>全双工,读一次,写一次。 类试适时监控的功能。
求教异步串口读写问题
将一个之前写的wince<em>串口</em><em>读写</em>程序移植到xp平台时,发现收正常,发<em>数据</em>的时候经常出现卡死的情况,后来查找了些资料,需要改为异步<em>串口</em>才行。但是改成异步之后,收发都不能进行了,改了点之后出现以下<em>问题</em>:rn[code=c]DWORD ChControlDlg::DataSend(const BYTE *buf , int length)rnrn UpdateData(true);rn if (m_hComm==INVALID_HANDLE_VALUE)rn rn return 0;rn rn BOOL fWriteState;rn DWORD dwBytesWritten;rnrn rn OVERLAPPED m_osWrite;rn memset(&m_osWrite,0,sizeof(OVERLAPPED));rn m_osWrite.hEvent=CreateEvent(NULL,TRUE,FALSE,NULL);rn COMSTAT ComStat; rn DWORD dwErrorFlags;rn ClearCommError(m_hComm,&dwErrorFlags,&ComStat);rn BOOL bWriteStat;rn DWORD wCount = 100;rn //bWriteStat = WriteFile(hCom, m_send, m_send.GetLength(), &wCount, &m_osWrite);//发送<em>数据</em>rn fWriteState=WriteFile(m_hComm,buf,length*sizeof(char),&dwBytesWritten,&m_osWrite);//此处,buf和length都可以正常读取,但是dwBytesWritten值始终为0,返回值fWriteState也为0.但是实际情况是在接收端已经正常显示收到了<em>数据</em>,这是为什么?哪里出错了么?rn if(!fWriteState)rn rn if(GetLastError()==ERROR_IO_PENDING)rn rn SetEvent(m_osWrite.hEvent);rn WaitForSingleObject(m_osWrite.hEvent,1000);rn rn rnrn return dwBytesWritten;rnrnDWORD ChControlDlg::ReadPortThread(LPVOID lpParameter)rnrn ChControlDlg* m_pSerial;rn m_pSerial=(ChControlDlg*)lpParameter;rn //我在此处设置了断点后,程序到此暂停,发端一直在发,现在可以接收到<em>数据</em>可以显示。继续运行完整以后暂停显示。如果不设断点,接受区什么反应都没rn BOOL fReadState;rn DWORD dwLength;rnrn COMSTAT ComStat;rn DWORD dwErrorFlags;rn OVERLAPPED m_osRead;rn memset(&m_osRead,0,sizeof(OVERLAPPED));rn m_osRead.hEvent=CreateEvent(NULL,TRUE,FALSE,NULL);rnrn ClearCommError(m_pSerial->m_hComm,&dwErrorFlags,&ComStat);rnrn m_pSerial->m_nBufferSize=min(m_pSerial->m_nBufferSize,(DWORD)ComStat.cbInQue);rnrn if (!m_pSerial->m_nBufferSize)rn rn return FALSE;rn rnrn char* buf=new char[m_pSerial->m_nBufferSize];rnrn while(m_pSerial->m_hComm!=INVALID_HANDLE_VALUE)rn rn fReadState=ReadFile(m_pSerial->m_hComm,buf,m_pSerial->m_nBufferSize,&dwLength,&m_osRead);rn if(!fReadState)rn rn //AfxMessageBox(_T("无法从<em>串口</em>读取<em>数据</em>!"));rn if (GetLastError()==ERROR_IO_PENDING)rn rn WaitForSingleObject(m_osRead.hEvent,2000);rn PurgeComm(m_pSerial->m_hComm, PURGE_TXABORT|rn PURGE_RXABORT|PURGE_TXCLEAR|PURGE_RXCLEAR);rn return m_pSerial->m_nBufferSize;rnrn rn return 0;rn rn elsern rn if(dwLength!=0)rn rn //回送<em>数据</em>rn if(m_pSerial->m_lpDataArriveProc!=NULL)rn rn m_pSerial->m_lpDataArriveProc(buf,dwLength,m_pSerial->m_dwUserData);//这个是做了一个消息传递,然后就处理<em>数据</em>并显示rn rn rn rn rn PurgeComm(m_pSerial->m_hComm, PURGE_TXABORT|rn PURGE_RXABORT|PURGE_TXCLEAR|PURGE_RXCLEAR);rn// return dwBytesRead;rnrnrn delete[] buf;rn return 0;rn[/code]
各位帮忙,串口读写问题?
我给一<em>串口</em>写入一<em>数据</em>,按协议应该返回02,04,00,04不为零的四个字符。但我现在返回的是四个零。我一读就是四个零。请问我<em>串口</em>哪儿初始化错误拉。在c_iflagrn,还是c_cflag,c_oflag.我写入保证是正确的。我现在外面出差,弄不完回不了家。各位帮帮忙?
通用串口类,串口读写
COMSTAT ComStat; DWORD dwErrorFlags; //错误标志位 BOOL bReadStatus;//读取状态 OVERLAPPED m_osRead;//<em>串口</em>设备的一些信息 memset(&m_osRead,0,sizeof(OVERLAPPED));//初始化内存 m_osRead.hEvent=CreateEvent(NULL,TRUE,TRUE,NULL); ClearCommError(hSerialComm,&dwErrorFlags,&ComStat);//清除<em>串口</em>的错误标志以便继续输入,输出操作 if(!ComStat.cbInQue) return 0; dwBytesRead = min(dwBytesRead,(DWORD)ComStat.cbInQue); bReadStatus=ReadFile(hSerialComm,buffer,dwBytesRead,&dwBytesRead,&m_osRead); if(!bReadStatus) //如果函数返回FALSE { if(ERROR_IO_PENDING==GetLastError()) { WaitForSingleObject(m_osRead.hEvent,2000); } } PurgeComm(hSerialComm,PURGE_TXABORT| PURGE_RXABORT|PURGE_TXCLEAR|PURGE_RXCLEAR);//清空<em>读写</em>缓存,停止为解决的<em>读写</em>操作
c#中串口数据读写的使用
将字符串<em>数据</em>写入指定<em>串口</em>,并读取显示出来,介绍在c#环境下使用<em>串口</em>的方法。
S3C2440 GPS串口配置以及数据读写
S3C2440 GPS<em>串口</em>配置以及<em>数据</em><em>读写</em> 参考文章:http://www.cnblogs.com/jason-lu/articles/3173988.html       http://www.cnblogs.com/chengmin/p/3818133.html        gps模块用<em>串口</em>线与S3C2440的ttyS1<em>串口</em>连接 <em>串口</em>操作需要的头文件
ROS用python读写串口数据
程序: import serial import struct ser = serial.Serial('/dev/ttyUSB0','115200') #write data1 = 1 data2 = 2 data3 = 3 data = struct.pack('&gt;BHB', data1, data2, data3) ser.write(data) #read data = '' ...
怎么往RS232串口读写数据
给PLC编控制程序用,多谢了!
STC15W4K16S4的串口读写EEPROM数据例程
参考STC公司例程,编写模块化的驱动文件,实现<em>串口</em>读取单片机片上EEPROM。
C#读写串口数据,读不到
如题,代码如下:rn[code=C#]using System;rnusing System.Collections.Generic;rnusing System.ComponentModel;rnusing System.Data;rnusing System.Drawing;rnusing System.Text;rnusing System.Windows.Forms;rnusing System.IO.Ports;rnrnnamespace WindowsApplication1rnrn public partial class Form1 : Formrn rn public Form1()rn rn InitializeComponent();rn rnrn rn SerialPort port1=new SerialPort();rnrn rn //接收<em>数据</em>rn private void port_DataReceived(object sender, SerialDataReceivedEventArgs e)rn rnrn // 读取缓冲区的<em>数据</em>rn string data = port1.ReadExisting();rn textBox1.Text = data;rn rnrnrn //初始化SerialPort对象方法.PortName为COM口名称,例如"COM1","COM2"等,注意是string类型rn public void InitCOM(string PortName)rn rn port1 = new SerialPort(PortName);rn port1.BaudRate = 9600;//波特率rn port1.Parity = Parity.None;//无奇偶校验位rn port1.StopBits = StopBits.One;//两个停止位rn port1.DataBits = 8;rn rn //DataReceived事件委托方法rn private void port1_DataReceived(object sender, SerialDataReceivedEventArgs e)rn rn // 读取缓冲区的<em>数据</em>rn string data = port1.ReadExisting();rn textBox1.Text = data;rn rnrn //打开<em>串口</em>的方法rn public void OpenPort()rn rn tryrn rn port1.Open();rn rn catchrn rnrn rn if (port1.IsOpen)rn rn Console.WriteLine("the port is opened");rn rn elsern rnrn Console.WriteLine("failure to open the port");rn rnrn rnrn //关闭<em>串口</em>rn public void ClosePort()rn rn port1.Close();rn if (!port1.IsOpen)rn rn Console.WriteLine("the port is already closed");rn rnrn rnrn //向<em>串口</em>发送<em>数据</em>rn public void SendCommand(string CommandString)rn rn port1.Write(CommandString);rn //Console.WriteLine(port1.ReadExisting());rn textBox1.Text = port1.ReadExisting();rn rnrnrn private void button1_Click(object sender, EventArgs e)rn rn if (!port1.IsOpen)rn rn InitCOM("COM1");rn OpenPort();rn rn SendCommand("abcdefg");rn rnrn private void button2_Click(object sender, EventArgs e)rn rn port1.Close();rn rnrn private void Form1_Load(object sender, EventArgs e)rn rn port1.DataReceived += new SerialDataReceivedEventHandler(port1_DataReceived);// new SerialDataReceivedEventHandler(port_DataReceived);rnrn rn rn[/code]
C#读写串口数据实现代码
C#中SerialPort类中DataReceived事件GUI实时处理方法 MSDN:从 SerialPort 对象接收<em>数据</em>时,将在辅助线程上引发 DataReceived 事件。由于此事件在辅助线程而非主线程上引发,因此尝试修改主线程中的一些元素(如 UI 元素)时会引发线程异常。如果有必要修改主 Form 或 Control 中的元素,必须使用 Invoke 回发更改请求,这将在正确的线程上执行.进而要想将辅助线程中所读到的<em>数据</em>显示到主线程的Form控件上时,只有通过Invoke方法来
学习Netty以便通过串口读写数据
最近在接触到Netty,以前都用的比较少。其实最近在项目中,发现很多地方都可以将Netty替代原来的Socket编程,应该在效率上会有改善。我也是先说下自己在项目中遇到的<em>问题</em>,去学习Netty.     由于项目中采用比较老的一个开源的框架,去<em>读写</em><em>串口</em><em>数据</em>。RxTxcommon.jar可以通过这个开源的框架去<em>读写</em><em>串口</em><em>数据</em>。后来Netty4.1.5以后,也有这种实现方法。效率比以前更快。实现方法都
急求传感器串口数据读写
JWSK-6系列网络型温湿度变送器和康海NC602-m<em>串口</em>服务器相连,有一台PC可以从<em>串口</em>服务器上获取<em>数据</em>,我又如何能将获取的<em>数据</em>重新发送到另一台PC上???rn或者如何从<em>串口</em>服务器上读取<em>数据</em>(PC接收,文本或<em>数据</em>库保存)? 实在不行从变送器上能读取<em>数据</em>保存为文本也行?rnrn用c/c++/c#实现都行,我刚学习这个,什么也不懂,跪求各位高手了!!!
如何通过串口读写数据?
用c语言来编写程序
VC6.0串口读写数据+ModBus协议??
VC6.0<em>串口</em><em>读写</em><em>数据</em>+ModBus协议rnrn我是用一个写COM1线程和一个读COM1线程rnModBus 分别用ASCII 和 TRU测试rn<em>读写</em>线程时间间隔都是0秒rn<em>问题</em>:rn 为什么运行一段时间报错呢---0x0040bcf7指令引用0x00548000内存,该内存不能为written rn 其中写线程还在运行,可以读线程自动中止了rnrnrn代码:rn[code=C/C++]rnHANDLE hHandle;rn#define RTU 1rn//1测试没<em>问题</em>rnclass VThread_Read : public VThreadrnrnpublic:rn virtual void Excute()rn rn //// RTUrnrn static long int i=0;rn unsigned char* pBuffer = new unsigned char[1024];rn unsigned long nBufferSize = 0;rn rn unsigned char* dest6 = new unsigned char[50];rn int destlen6 = 0;rn memset(dest6,0,50);rn unsigned char sDeviceNO;rn unsigned char sFunCode;rnrn while( !m_bTerminated )rn rn destlen6=0;rn nBufferSize = 0;rn memset(dest6,0,50);rn memset(pBuffer,0,1024);rn sDeviceNO=0;rn sFunCode=0;rnrn if( Com_Read( hHandle, pBuffer, 10, &nBufferSize, 1000 ) > 0 ) rn rn pBuffer[nBufferSize] = '\0';rnrn printf("i_Read:%d\n",i++);rn //printf("pBuffer = %s \n",pBuffer);rn int res=0;rn res=FrameAnlys_RTU( dest6, &destlen6, &sDeviceNO, &sFunCode, 8, pBuffer );rnrn if(res==-1)rn rn printf("Read Error!!\n");rn continue;rn rn printf("destlen6 = %x, sDeviceNO = %x, sFunCode = %x \n", destlen6, sDeviceNO, sFunCode ); rn for (int i = 0; i < destlen6; i++ )rn rn printf( "rtutoascii = %x \n", *dest6++ );rn rn rn elsern rn printf(" VFT_Read failed !!!! \n");rn rn //Sleep(1000);rn //whilern delete []pBuffer;rn delete []dest6;rn rnrn//////////////////////////////////////////////////////////rnrnclass VThread_Write : public VThreadrnrnpublic:rn virtual void Excute()rn rn //// RTUrn static long int i=0;rn unsigned char source5[] = 0x12, 0x34, 0x56 ;rn unsigned char* dest5 = new unsigned char[50];rn unsigned long nBufferSize = 0;rn int destlen5 = 0;rnrn while( !m_bTerminated )rn rn nBufferSize = 0;rn destlen5 = 0;rn memset(dest5,0,50);rn Frame_RTU( dest5, &destlen5, 0xAA, 0xBB, 3, source5 );rnrn if( Com_Write( hHandle, (char *)dest5, destlen5, &nBufferSize ) > 0 ) rn rn //printf("nBufferSize = %d \n",nBufferSize);rn printf("i_Write:%d\n",i++);rn rn elsern rn printf(" VFT_Write failed !!!! \n");rn rn //for (int i = 0; i < strlen((char*)dest5); i++ )rn //rn // printf( "dest5 = %02x \n", dest5[i] );rn //rn //printf("\n\n\n");rn //Sleep(1000*2);rn //whilern delete [] dest5;rn rnrn[/code]rnrn
我能读写串口数据么?
我想<em>读写</em><em>串口</em><em>数据</em>,请问vc6.0有专门<em>读写</em><em>串口</em>的类么?...请大虾们指教我怎样才能得到<em>串口</em>的<em>数据</em>....
关于串口读写数据,请高手帮忙!!!
是否writefile写入以后自动监听返回值还是需要设置一个函数来监听接收<em>数据</em>rnBOOL CConCtrl::OpenPower()rn rn DWORD nWrtn = 0;rn flag=1;rn BOOL retW = WriteFile(m_hCom,m_uBufOnPower,7,&nWrtn,&wOverLaped);rn return retW;rnrnrn这两段是怎么关联的。rnvoid CConCtrl::ProcRecv()rnrn DWORD res,factbyte;rn unsigned char rbuf[7]=0;rn COMSTAT rst;rn ClearCommError(m_hCom,&res,&rst);rn rOverLaped.hEvent = CreateEvent(NULL,TRUE,FALSE,NULL);rn if (!ReadFile(m_hCom,rbuf,7,&factbyte,&rOverLaped))rn rn res =WaitForSingleObject(rOverLaped.hEvent,1000);rn if (WAIT_TIMEOUT==res)rn rn CancelIo(m_hCom);rn AfxMessageBox("读入<em>数据</em>超时!");rn return;rn rn rnrn
读写 uim 卡(分析串口数据的疑问)
使用网络上流传的uim卡<em>读写</em>软件(cdma uim card personalize),通过<em>串口</em>抓包分析其<em>读写</em>卡时的<em>数据</em>。。rnrn前面的几行<em>数据</em>是:rnrn1 [00000000] IRP_MJ_CREATE Port Opened - srn2 [00000003] IOCTL_SERIAL_SET_BAUD_RATE Baud Rate: 38400rn3 [00000004] IOCTL_SERIAL_SET_LINE_CONTROL StopBits: 1, Parity: No, DataBits: 8rn4 [00000008] IOCTL_SERIAL_SET_BAUD_RATE Baud Rate: 9600rn5 [00000008] IOCTL_SERIAL_SET_LINE_CONTROL StopBits: 2, Parity: Even, DataBits: 8rn6 [00000008] IOCTL_SERIAL_SET_BAUD_RATE Baud Rate: 9600rn7 [00000009] IOCTL_SERIAL_SET_LINE_CONTROL StopBits: 2, Parity: Even, DataBits: 8rn8 [00000029] IRP_MJ_READ Length: 0011, Data: 3B 97 11 00 02 02 04 22 00 3F 03 rn9 [00000049] IRP_MJ_READ Length: 0011, Data: 3B 97 11 00 02 02 04 22 00 3F 03 rn10[00000049] IRP_MJ_WRITE Length: 0005, Data: A0 A4 00 00 02rn11[00000055] IRP_MJ_READ Length: 0006, Data: A0 A4 00 00 02 A4 rn12[00000055] IRP_MJ_WRITE Length: 0002, Data: 3F 00 rn13[00000062] IRP_MJ_READ Length: 0004, Data: 3F 00 9F 17 rnrn其中,第8,第9两行,从<em>数据</em>上看,应该是 复位时的应答(ATR),可是怎么会有两个呢?rn再有,我自己通过win32 api 和 CSerialPort 都没办法读到这两行<em>数据</em>。。有谁能解惑解惑???当然了,接下来的<em>数据</em><em>读写</em>也不正确。rnrn各位高见,还请多多指教rnrn其中,CSerialPort代码如下:rn[code=C/C++]rnBOOL CSerialPortRW::Read()rn BYTE* pBuf = new BYTE[2048];rn memset(pBuf,0,2048);rnrn CSerialPort sPort;rn rn if(sPort.IsOpen())rn sPort.Close();rn rn tryrn sPort.Open(m_nPort,rn 9600,rn CSerialPort::EvenParity,rn 8,rn CSerialPort::TwoStopBits,rn CSerialPort::NoFlowControl,rn TRUE);rnrn sPort.Setup(1024,1024);rn rn //设置按二进制读取???rn DCB dcb;rn sPort.GetState(dcb);rn dcb.fBinary=1;rn rn sPort.SetState(dcb);rnrn CEvent cEvent(FALSE, TRUE);rn OVERLAPPED overlapped;rn memset(&overlapped, 0, sizeof(overlapped));rn overlapped.hEvent = cEvent;rnrn tryrn rn sPort.Read(pBuf, 36, overlapped); //想要在这读取ATR,返回空值。。什么都没有rn sPort.Read(pBuf,36,overlapped);rn rn catch(CSerialException* pEx)rn rn if (pEx->m_dwError == ERROR_IO_PENDING)rn rn DWORD dwBytesTransferred = 0;rn sPort.GetOverlappedResult(overlapped, dwBytesTransferred, TRUE);rn pEx->Delete();rn rn elsern rn DWORD dwError = pEx->m_dwError;rn pEx->Delete();rn CSerialPort::ThrowSerialException(dwError);rn rn rn catch(CSerialException* pEx)rn // TODO:设置出错信息1024rn char error[1024];rnrn pEx->GetErrorMessage(error,1024);rn pEx->Delete();rnrn sPort.Close();rn return -1;rn rn rn sPort.Close();rnrn delete[] pBuf;rn return 1;rnrnrn[/code]
用多线程实现串口读写数据以及文件的读写
适合的读者:初学用多线程实现对<em>串口</em>的异步操作,对线程的理解,以及对<em>串口</em>的<em>读写</em>。还有文件的<em>读写</em>都有最基本的使用方式。调试时,可以用<em>串口</em>调试助手一起结合的去学习~
C#实现串口操作(包括读写串口,显示数据
C#实现打开<em>串口</em>,关闭<em>串口</em>,利用<em>串口</em>接收和发送<em>数据</em>,并且能把<em>数据</em>实时显示在屏幕上,实现世博功能!
二进制读写数据问题
比如要写入文本几个二进制<em>数据</em>分别是:00,01,1000,1001,1010,1011,110000……等,rn现在想要连续存储,即保存为0001100010011010101111000……用fwrite分别写入好像不行,应该怎么写呢?rn是每个<em>数据</em>分别写入还是将他们放在一起写入呢?rnrn还有就是如何从0001100010011010101111000中读取各个<em>数据</em>呢?比如按3个bit读取一个数值,求帮忙
数据数据读写问题
我初学PHP 试验一下操作<em>数据</em>库的<em>数据</em>的插入和读 ,却老提示24.28行有<em>问题</em>。。。。我改了很久还是没发现怎么出错。。。求指正。。。。。。rnrnrnrnrnrnhello,you are .rnyou are years oldrn
Javascript翻页封装下载
Javascript翻页封装,很好用的原生页码翻页封装打包好送出 相关下载链接:[url=//download.csdn.net/download/wjf19850329/6038087?utm_source=bbsseo]//download.csdn.net/download/wjf19850329/6038087?utm_source=bbsseo[/url]
图像处理之C#.NET编程与实验.孙燮华.扫描版下载
图像处理之C#.NET编程与实验.孙燮华.扫描版 相关下载链接:[url=//download.csdn.net/download/klmn323/8250573?utm_source=bbsseo]//download.csdn.net/download/klmn323/8250573?utm_source=bbsseo[/url]
OC和swift混编下载
OC和swift混编, 相关下载链接:[url=//download.csdn.net/download/quanqinayng/8458499?utm_source=bbsseo]//download.csdn.net/download/quanqinayng/8458499?utm_source=bbsseo[/url]
相关热词 c# 线程结束时执行 c# kb mb 图片 c# 替换第几位字符 c#项目决定成败 c# 与matlab c# xml缩进 c#传感器基础 c#操作wps c# md5使用方法 c# 引用父窗口的组件
我们是很有底线的