❶ 求教android蓝牙串口开发OutputStream发送数据失败的问题
1、首先确保你发送的数据是正确的,串口接收到这个数据后他能识别,并返回你想要的数据,如果你发送的命令本身不要求返回数据,inputstream是读取不到数据的。 2、其次,要确保发送数据的格式正确,比如一段16进制数据,你定义为String="01230545"类型,然后发送的时候out.write(str.getBytes());这样发送的数据是不对的,应该定义一个byte型的数组,然后发送这个数组 3、以上你都确保没问题了,你可以用循环去读取数据,当读到的内容大于0时停止读取。用循环读取你要确保你已经设置读取的超时时间了,不然程序有可能阻塞。
❷ android 串口 unsatisfiedlinkerror什么异常
[Android
调试]
android串口通信问题,基于android
studio
NDK
UnsatisfiedLinkError
when
lowering
project
api
level
21
to
19
而
stackoverflow
的哥们
rebuild
就好了,我各种羡塌折腾也不见好呐,于是看到上一篇
eoe
的,给了我思路:
我尺派肢们看下包含该函数
**tcgetattr**
的文件,
比较下
NDK
api
19
和
23
的
termios.h
文件:
23
的该文件陵世目录:
D:/Android/Sdk/ndk-bundle/platforms/android-23/arch-arm/usr/include
api
23
下
termios.h
文件:
api
19
下
termios.h
文件:
这两个文件确实不一样,于是把19下的该文件复制到
jni
目录,
重新编译后,运行,OK,当然设置
compileSdkVersion
19
也是可以的
❸ android应用程序开发,为串口接收数据创建的子线程问题,急!
找Bug应该要有条理,我们首先不能确定"每次都去执行while(value2 != 1)以外的代码",因为程序执行的很快,可能收发很快,循环每妙执行多少次不确定,而且你的阻塞时间还是0,最好循环内外加上输出判断是不是每次都执行循环体外的代码。
再就是你创建的是两个循环,开头
fd = HardwareControler.openSerialPort("/dev/ttyUSB0", buaterate, 8, 1);
每次读取完数据都会给fd重新赋值, 不确定打开串口是否有应答数据,如果有的话
打开串口->应答数据->有数据,执行第二个循环->读数据->重新第一个循环
这样可能会一直有数据,可把fd = HardwareControler.openSerialPort("/dev/ttyUSB0", buaterate, 8, 1);放到第一个循环外面。
这些只是推测,需要你根据自己代码慢慢调试。
❹ android 串口为什么不能正常读写
串口通让游信枝滑拦数据丢失很大一部分原因是:mscomm的inputlen设置设置有问题;
解决方案:
mscomm的inputlen设置为0吧(读取整个缓冲区),读完一次,清空一次缓冲区试试;
参考如下:
猛胡窗体初始化事件中建议将mscomm的这几个属性做如下设置:
mscomm.inbuffersize=8 '接收缓冲区大小
mscomm.rthreshold=4 '促发oncomm事件的字符数
mscomm.inputlen=0 '默认读取整个缓冲区
mscomm.inputmode=cominputmodetext '以文本方式接收
mscomm.inbuffercount=0 '清空缓冲区
oncomm事件中,建议处理完接收数据后用mscomm.inbuffercount=0清空缓冲区
❺ android 串口读数导致界面卡死
需要用子线程去读取数据,当数据读取完成,通过handler 发送一个消息让主线程去更新UI
❻ Android读串口数据阻塞怎么办
我这边也在做Android和硬件设备的串口通信。
我的通信方式很简单,我这边发送数据,接收数据(接收数据的内容中有标识位让我判断这次接收到的数据的相应处理动作)
读数据的时候我做的是一个清空的办法,每一次读取数据,如果读到的数据准确则进行处理,如果有误就清空了在读。
如果说接收的数据要对应上发送的数据,你可以在Android这边发送数据后不在发送数据只读取,并开启一个计时器,当这段时间内么有接收到返回值就继续你的发送和读取功能
❼ 串口ReadFile读取数据一直有阻塞,即使有数据上来,该怎么解决
串口同步读写数据,ReadFile会一直阻塞,但是用串口调试助手可以接受到数据。 不过之后再启动程序就正常了,很郁闷,不知道问题出现在哪里,下面把代码贴出来: 以同步方式打开串口: bool CSerialIO::openSerialPort(char* szSerial){HANDLE hSerial=CreateFileA(szSerial, GENERIC_READ|GENERIC_WRITE,0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);if(INVALID_HANDLE_VALUE==hSerial) return false; this->hComm=hSerial; memcpy(cComm,szSerial,strlen(szSerial)); cComm[strlen(szSerial)]='\0'; return true;}读串口:unsigned WINAPI RecieveData(void* pProcessData){ProcessData* pPD=(ProcessData*)pProcessData;while(1){if(pPD->bClosePushThread==true) ExitThread(0); byte byteTempBuffer[512]={0}; int iRead=0; if(pPD->pSerialIO->readSerialPort(byteTempBuffer,511,iRead)){if(iRead<=0){Sleep(1000);continue;}else{pPD->critSecData.lock(); pPD->bVectorRawData.insert(pPD->bVectorRawData.end(),byteTempBuffer,byteTempBuffer+iRead); pPD->critSecData.unLock();continue;}}Sleep(1000);}return 0;}这是一个线程入口函数,pPD->pSerialIO->readSerialPort(byteTempBuffer,511,iRead)这句代码实际上就是调用ReadFile来读串口数据,在这里设个断点,每次进入这个线程都会阻塞在这个地方,但是如果我用下串口调试助手后,就不会出现这个问题,也就是说 我要读写的串口必须要先被其他的进程读写过,然后才能正常运行。 ps:不要建议我异步读写串口,因为我现在问题还没解决。不知道是不是还需要对串口的参数进行设置。 再说下重点,我的程序可以正常运行的前提是:程序运行之前,用过串口调试助手之类的,也就是说必须要利用别的程序对串口的参数进行设置我的程序才能正常运行。
❽ 串口通讯程序为什么WriteFile被阻塞
BOOL CSeriesPort::WritePort(HANDLE hc, const BYTE* buf, DWORD len)
{
DWORD wnum = 0;
DWORD hnum = 0; //已写入了字节
ASSERT(hc != INVALID_HANDLE_VALUE);
do
{
if(WriteFile(hc,buf + hnum,len - hnum, &wnum, NULL)) //阻塞在这猜镇芦里,单步执行也不行,直到接收到数据时才执行到下一步
{
hnum = hnum + wnum;
if(hnum == len)
{
break;
}
Sleep(10);
}
else
{
return FALSE;
}
} while (TRUE);
return TRUE;
}
DWORD CSeriesPort::ReadThreadFunc(LPVOID lp)
{
CSeriesPort* ps = (CSeriesPort*)lp;
DWORD evt;
BYTE* rbuf = NULL; //读取的字节
DWORD rLen = 0; //实际读取的字旅知节
DWORD wLen;
DWORD rError;
COMSTAT cmstate;
ASSERT(ps->m_hComm != INVALID_HANDLE_VALUE);
PurgeComm(ps->m_hComm, PURGE_RXCLEAR | PURGE_TXCLEAR); //清空缓冲区
SetCommMask(ps->m_hComm, EV_RXCHAR | EV_CTS | EV_DSR);
while(TRUE)
{
if(WaitCommEvent(ps->m_hComm, &evt, 0))
{
SetCommMask(ps->m_hComm, EV_RXCHAR | EV_CTS | EV_DSR); //接收到数据时WriteFile才能继续
//串口收到字符
if(evt & EV_RXCHAR)
{
ClearCommError(ps->m_hComm, &rError, &cmstate);
wLen = cmstate.cbInQue;
if(wLen <= 0)
{
continue;
}
rbuf = new BYTE[wLen];
memset(rbuf, '\0'穗带, wLen);
ReadFile(ps->m_hComm, rbuf, wLen, &rLen, 0);
if(rLen > 0) //触发读事件
{