
1 数据格式不正确:请确保您所抓取的串口数据格式正确,例如数据位、停止位、奇偶校验等设置是否与设备的设置一致。
2 数据损坏:请检查抓取的串口数据是否损坏。如若是,可以尝试更换串口设备或线缆。
3 程序兼容性问题:请确保您所使用的串口抓取工具与您的电脑 *** 作系统兼容。建议选择最新版本的串口抓取工具使用。
4 异常中断:如果您在抓取数据时出现了异常中断,可能会导致数据出现损坏。此时需要重新抓取数据。
5 其他问题:如果以上方法都无法解决问题,请尝试将问题描述得更加详细,并咨询相关的技术支持或讨论串口抓取论坛寻求帮助。
总之,出现串口数据无法使用的情况,需要逐一排查问题并进行适当的修复。
代码如下:
import comfriendlyarmAndroidSDKHardwareControler;
import androidappActivity;
import androidosBundle;
import androidosHandler;
import androidosLooper;
import androidosMessage;
public class MapGuider_Activity extends Activity{
private int serial_fd=0;
private byte[] serial_RevBuf=new byte[100];
private byte[] serial_SendBuf="fsjajd"getBytes();
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
superonCreate(savedInstanceState);
setContentView(Rlayoutmapguider);
serial_fd=HardwareControleropenSerialPort("/dev/s3c2410_serial1", 115200, 8, 1);
if(serial_fd!=-1)
{
Systemoutprintln("打开串口成功");
HardwareControlerwrite(serial_fd, serial_SendBuf);
lac_handlerpost(RevicePosDataThread);
}
else
{
Systemoutprintln("指定的串口不存在或在其它进程中已被打开");
}
}
@Override
protected void onDestroy() {
// TODO Auto-generated method stub
HardwareControlerclose(serial_fd);
Systemoutprintln("关闭串口");
lac_handlerremoveCallbacks(RevicePosDataThread);
superonDestroy();
}
Handler lac_handler =new Handler(){
@Override
public void handleMessage(Message msg) {
// TODO Auto-generated method stub
superhandleMessage(msg);
}
};
Runnable RevicePosDataThread =new Runnable()
{
int err=0;
String s;
public void run() {
// TODO Auto-generated method stub
while(true)
{
//Looperprepare();
err=HardwareControlerselect(serial_fd, 1, 0);
if(err==1)//有数据可读
{
HardwareControlerread(serial_fd, serial_RevBuf, 10);
s=new String(serial_RevBuf);
Systemoutprintln("接收到串口数据"+s);
}
else if(err==0) //无数据可读
{
Systemoutprintln("没有接收到串口数据");
}
else //出错
{
Systemoutprintln("接收到串口数据出错");
}
try {
Threadsleep(2);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
eprintStackTrace();
}
}
}
};
}
MSCOMM控件在VB6的企业版中有,需通过部件添加方式加载。
Private Sub MSComm_OnComm()
Dim bytInput() As Byte
Dim intInputLen As Integer
Select Case frmMainctrMSCommCommEvent
Case comEvReceive
If blnReceiveFlag Then
If Not frmMainctrMSCommPortOpen Then
frmMainctrMSCommCommPort = intPort
frmMainctrMSCommSettings = strSet
frmMainctrMSCommPortOpen = True
End If
'此处添加处理接收的代码
frmMainctrMSCommInputMode = comInputModeText '按ASCII接收
intInputLen = frmMainctrMSCommInBufferCount
ReDim bytInput(intInputLen)
bytInput = frmMainctrMSCommInput
Text1 = bytInput
Text2 = Text1
jscd = Len(Text1)
If Left(Text1, 1) <> Chr(27) Or jscd > 25 Then '
frmMainLabel3BackColor = vbRed
frmMainLabel3ForeColor = vbWhite
frmMainLabel3Caption = "接收信号出错!"
ElseIf Left(Text2, 1) = Chr(27) And Mid(Text2, 25, 1) = Chr(13) Then
frmMainLabel3BackColor = vbGreen
frmMainLabel3ForeColor = vbBlack
frmMainLabel3Caption = "接收信号正常!"
If Left(Text2, 6) = Chr(27) & "R0032" And jscd = 25 Then
If Val(fa2) >= 0 And Len(fa2) = 4 Then
fa2 = "0" & Mid(fa2, 2, 3)
End If
frmMaintxtSend = Chr(27) & fa0 & fa1 & "9999" & zhenkong & fa2 & fa3 & fa4 & Chr(13)
lenTxtSend = Len(txtSend)
frmJishiLabel8Caption = txtSend
frmJishiLabel11Caption = lenTxtSend
If lenTxtSend = 24 Then
Call commFasong
Else
frmMainLabel3BackColor = vbRed
frmMainLabel3ForeColor = vbWhite
frmMainLabel3Caption = "发送信号出错!"
End If
blL1 = Mid$(Text2, 19, 2)
If blL1 = "01" Then
record_jmm(0) = Val(Mid$(Text2, 21, 4)) / 10 '制品1温度
ElseIf blL1 = "02" Then
record_jmm(1) = Val(Mid$(Text2, 21, 4)) / 10 '制品2温度
ElseIf blL1 = "03" Then
record_jmm(2) = Val(Mid$(Text2, 21, 4)) / 10 '制品3温度
ElseIf blL1 = "04" Then
record_jmm(3) = Val(Mid$(Text2, 21, 4)) / 10 '制品4温度
ElseIf blL1 = "05" Then
record_jmm(4) = Val(Mid$(Text2, 21, 4)) / 10 '制品5温度
ElseIf blL1 = "06" Then
record_jmm(5) = Val(Mid$(Text2, 21, 4)) / 10 '制品6温度
End If
record_jm(0) = Val(record_jmm(0))
record_jm(1) = Val(record_jmm(1))
record_jm(2) = Val(record_jmm(2))
record_jm(3) = Val(record_jmm(3))
record_jm(4) = Val(record_jmm(4))
record_jm(5) = Val(record_jmm(5))
blL = Mid$(Text2, 7, 6)
Call Hex_bin '输出口状态鉴别
blLg = Mid$(Text2, 13, 6)
Call hex_bin1 '输出口故障状态鉴别
txtSend = ""
Else
txtSend = ""
End If
End If
If Not blnAutoSendFlag And Not blnReceiveFlag Then
frmMainctrMSCommPortOpen = False
End If
End If
End Select
End Sub
以上是一段MSCOMM的ONCOMM事件代码,接收的数据按上下位机约定取出赋值于全局变量,在其它窗体进行数据记录(写入数据库)至于数据分析确如一楼说的可以海阔天空,通过数据控件及SQL语句来完成任务
以下提供MSDN参考:
OnComm 常数
常数 值 描述
comEvSend 1 发送事件。
comEvReceive 2 接收事件。
comEvCTS 3 clear-to-send 线变化。
comEvDSR 4 data-set ready 线变化。
comEvCD 5 carrier detect 线变化。
comEvRing 6 振铃检测。
comEvEOF 7 文件结束。
MSComm 控件提供下列两种处理通讯的方式:
事件驱动通讯是处理串行端口交互作用的一种非常有效的方法。在许多情况下,在事件发生时需要得到通知,例如,在 Carrier Detect (CD) 或 Request To Send (RTS) 线上一个字符到达或一个变化发生时。在这些情况下,可以利用 MSComm 控件的 OnComm 事件捕获并处理这些通讯事件。OnComm 事件还可以检查和处理通讯错误。所有通讯事件和通讯错误的列表,参阅 CommEvent 属性。
在程序的每个关键功能之后,可以通过检查 CommEvent 属性的值来查询事件和错误。如果应用程序较小,并且是自保持的,这种方法可能是更可取的。例如,如果写一个简单的电话拨号程序,则没有必要对每接收一个字符都产生事件,因为唯一等待接收的字符是调制解调器的“确定”响应。
SThreshold 属性
在 MSComm 控件设置 CommEvent 属性为 comEvSend 并产生 OnComm 事件之前,设置并返回传输缓冲区中允许的最小字符数。
说明
若设置 Sthreshold 属性为 0(缺省值),数据传输事件不会产生 OnComm 事件。若设置 Sthreshold 属性为 1,当传输缓冲区完全空时,MSComm 控件产生 OnComm 事件。
如果在传输缓冲区中的字符数小于 value,CommEvent 属性设置为 comEvSend,并产生 OnComm 事件。comEvSend 事件仅当字符数与 Sthreshold 交叉时被激活一次。例如,如果 Sthreshold 等于 5,仅当在输出队列中字符数从 5 降到 4 时,comEvSend 才发生。如果在输出队列中从没有比 Sthreshold 多的字符,comEvSend 事件将绝不会发生。
CommEvent 属性包含实际错误或产生 OnComm 事件的数码。注意,设置 Rthreshold 或 Sthreshold 属性为 0,分别使捕获 comEvReceive 和 comEvSend 事件无效。
请问数据源来自哪里!
个人觉得:
1、读取串口数据先设置好com口,波特率、奇偶校验、停止位数、数据位数等
2、数据发送了数据口,串口适当延时后在读取。
3、你可以把串口的2#和3脚短路,进行调试程序!电脑先发送数据,然后立即读取,以测试硬件和软件。
首先硬件要有max232芯片做电平转换
或者直接用pl2303做usb转串口
软件要有一个串口调试工具
至于程序就是
(1):设置串口相关寄存器
注意波特率设置
(2):把数据放在sbuf里面
(3):检查是否发送完毕没完等待
发完了就继续放
各种单片机设置方法不一样就给你一个51
的程序你参考一下:
//wx原创
串口调试程序
向pc发送数据
用于调试观察数据
#include
#include
sbit
k1=p10;
void
ckfszf(char
zf);
void
ckfszfc(char
fsgs,char
zfc[]);
bit
cksnbzw=0;
char
fsb[]={"abcdef"};
main()
{
pcon=0x80;
//串口设置
tmod=0x20;
//
以t1定时器为波特发生器
波特率:19200
th1=0xfd;
tl1=0xfd;
tr1=1;
scon=0x50;
//串口设置模式一完毕
while(1)
{
ti=1;
ckfszfc(6,fsb);
ckfszf('
');
ckfszfc(9,"1234567890");
ckfszf('
');
ckfszf('
');
ckfszf('
');
ckfszfc(12,"aabbccddeeffgg");
ckfszf('
');
while(1);
}
}
//字符
串口发送函数
由串口向外发送一个字符
//参数1:要发送字符
//返回值:无
//备注:
本函数内部检查上次发送是否结束
//
全局初始化要求:ti=1
保证第一次进入此函数之前ti=1
void
ckfszf(char
zf)
{
while(ti==0);
//等待发送完毕
ti=0;
sbuf=zf;
}
//字符串
串口发送函数
由串口向外发送一个字符串
//参数1:要发送字符串个数
取值:0~255
//参数2:要发送字符串数组名
或字符串本身
//返回值:无
//备注:
本函数内部检查上次发送是否结束
//
全局初始化要求:ti=1
保证第一次进入此函数之前ti=1
void
ckfszfc(uchar
fsgs,char
zfc[])
{
uchar
i;
cksnbzw=1;
for(i=0;i
评论
0
0
加载更多
Comm1CommName := 'com1';
Comm1BaudRate := 4800;//波特率每个机器都不一样
Comm1Parity := TParity(2);
Comm1ByteSize := TByteSize(2);
Comm1StopBits := TStopBits(2);
Comm1StartComm; //开始记得结束哦
以上代码在formshow里面写
然后写下面的过程
procedure Tfrm_cnc_h_edtComm1ReceiveData(Sender: TObject; Buffer: Pointer;
BufferLength: Word);
var str: string;
begin
editClear;
SetLength(Str, BufferLength);
move(buffer^, pchar(@Str[1])^, bufferlength);
editText := trim(Str);// 这里显示到你要的edittext
sendmessage(edt_measurehandle, wm_keydown, vk_return, 0);
end;
最后在formclose 里面写上
Comm1StopComm; //comm1结束
控件在system这里面找跟手电筒一样的那个就是
代码你可以复制,便宜你了。
以上就是关于抓取的串口的数据无法使用全部的内容,包括:抓取的串口的数据无法使用、android如何读取串口数据、如何实现串口数据采集,如何分析这些数据等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)