❶ 求教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) //觸發讀事件
{