串口调试助手,可以接收到仪器发出来的数据。 自己编写的程序,无法接收到仪器发出来的数据。

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了串口调试助手,可以接收到仪器发出来的数据。 自己编写的程序,无法接收到仪器发出来的数据。相关的知识,希望对你有一定的参考价值。

下面是自己写的程序
//打开串口3
int i,length_data=0; int fd_port3; int status;
struct termios newtio,oldtio;
unsigned char buffer0[40];
fd_port3 = open("/dev/ttySAC3",O_RDWR);
//串口,波特率,数据位,奇偶校验,停止位
//保存测试现有串口参数设置,在这里如果串口号等出错,会有相关的出错信息
tcgetattr(fd,&oldtio) ;
bzero( &newtio, sizeof( newtio ) );
//通过位掩码的方式激活本地连接和接受使能选项
newtio.c_cflag |= CLOCAL | CREAD;
newtio.c_cflag &= ~CSIZE;
//数据位的设置为8
newtio.c_cflag |= CS8;
//奇偶校验的设置为无校验
newtio.c_cflag &= ~PARENB;
newtio.c_iflag &= ~INPCK;
//波特率的设置为9600
cfsetispeed(&newtio, B9600);
cfsetospeed(&newtio, B9600);
//停止位的设置为1
newtio.c_cflag &= ~CSTOPB;
//设置等待时间和最小接收字符
newtio.c_cc[VTIME] = 10;
newtio.c_cc[VMIN] = 0;
//处理为接收字符
tcflush(fd,TCIFLUSH);
// 设置输入输出为原始模式(Raw Mode)
newtio.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG); /*Input*/
newtio.c_oflag &= ~OPOST; /*Output*/
//激活新配置
tcsetattr(fd,TCSANOW,&newtio);
//拉高DTR
ioctl(fd,TIOCMGET,&status);
status |= TIOCM_DTR;
ioctl(fd,TIOCMSET,&status);
memset(buffer0,0,sizeof(buffer0));
while(1)

//接收串口3的数据
length_data = read(fd_port3,buffer0,sizeof(buffer0)); //数据的发送使用write(fd_port,buf,1); buf为要发送的字符串
printf("length_data=%d\n",length_data);
printf("buffer is \n");
if(length_data != 0)

for(i=0;i<40;i++)

printf(" %02hhx ",buffer0[i]);

printf("\n");


请教下各位大神,是不是有些参数,串口调试助手设置了而我没设置。该怎么改才能正确收到仪器发来的数据。

参考技术A 1、你说用串口助手可以接收数据,你的程序不能:这个时候仪器和你的开发板如何接线?
2、你的串口接线是2,3,5三根吗?
3、到Modem Line状态里面设置DTR和RTS,选择相应的设置属性(Line CTS State、Line DCD State、Line DSR
State、Line DTR State、Line RI State或Line RTS State)。
参考技术B 那就是不对呗
需要给你完成一份吗追问

不是程序的问题,是仪器端的串口接了DTR信号线,而我开发板这段的串口没有接DTR信号线到处理器,导致我无法给仪器提供一个DTR信号。您有什么办法能解决吗?

追答

好吧 帮顶吧

自己编了个C#的串口调试程序,但发送命令后,得不到数据!找不到问题所在,想请教各位!谢谢,急用!

public void comm_DataReceived(object sender, SerialDataReceivedEventArgs e)

if (Closing)

return;

try

int n = comm.BytesToRead;
byte[] buf = new byte[n];
Received_count += n;
comm.Read(buf, 0, n);
builder.Clear();

this.Invoke((EventHandler)(delegate

if (checkBox1.Checked)

foreach (byte b in buf)

// richTextBox1.Text += b;
builder.Append(b.ToString("X2") + " ");



else

builder.Append(Encoding.ASCII.GetString(buf));


this.richTextBox1.AppendText(builder.ToString());
labelGetCount.Text = "接收个数:" + Received_count.ToString();
));



finally


Listening = false;


private void SerialPortSendMessage()//发送数据

int n = 0;
//若为十六进制数就不用勾选,若不为十六进制数则可以勾选,将非十六进制数转换为十六进制
if (checkBoxHexSend.Checked)

MatchCollection mc = Regex.Matches(SendString_TextBox.Text, @"(?i)[\da-f]2");//用正则得到一个十六进制数
List<byte> buf = new List<byte>();
foreach (Match m in mc)


buf.Add(byte.Parse(m.Value));

comm.Write(buf.ToArray(), 0, buf.Count);
n = buf.Count;

else


if (checkBoxNewlineSend.Checked)

comm.WriteLine(SendString_TextBox.Text);
n = SendString_TextBox.Text.Length + 2;

else//不包含换行符

try

comm.Write(SendString_TextBox.Text);//将指定的字符串写入到com3端口中

catch

MessageBox.Show("输入错误!");

n = SendString_TextBox.Text.Length;

send_count += n;
labelSendCount.Text = "发送个数:" + send_count.ToString();




好吧,求人不如求己!唉

参考技术A 1、发送命令后?
你能确认命令发出去了吗?
2、得不到数据?
是发送命令后串口本应该接到数据而没有,还是你想向串口自己发命令???
3、问题描述不清楚
让人很难帮到你。。。。追问

问题描述不清楚?好吧

追答

得不到数据有很多可能性,比如你没发出指令、发出的指令有错误,对方无法识别、对方没有正确解析指令、对方没有给你返回数据,等等。。。。
还有一种可能,你打开串口时只设定为接收模式,没有指定收发模式,所以发送时卡死了,命令根本没发出去。

参考技术B Convert.ToByte(m.Value, 16)用这个就可以了 参考技术C 问一下你的情况,你的设备是接收16进制还是接收的字符串??
问题处理好了吗??

以上是关于串口调试助手,可以接收到仪器发出来的数据。 自己编写的程序,无法接收到仪器发出来的数据。的主要内容,如果未能解决你的问题,请参考以下文章

stm32发送数据给上位机用串口调试助手接收为什么只接收到第一个字节数据?

串口调试助手都能实现啥功能啊

易语言串口调试怎么判断串口数据接收完成。最好有源码每次接收到的数据长度不一样。(无自定义规约)

怎么用串口助手发送数组?

串口调试助手

LabVIEW串口调试助手