api串口編程
1. 有關windows下串口編程的問題,波特率較高
電腦的串口的波特率也是有上限的,不是你想要多少都行的,這是要受硬體限制的,對於非同步串列通信,波特率能達到256000已經是最大限定了,通常的電腦只支持到128000。雖然支持到128000,可是實際真要做到這個波特率,通信就變成很不穩定了,收發數據很容易會出現錯誤。你那要求921600,就是空想。再說了,什麼設備需要這么高的波特率。非要這么高,用CAN匯流排吧,可以達到1M的波特率。
2. 請問 DELPHI串口通訊編程 的基本思路是什麼
用Delphi開發串口通信軟體一般有兩種方法:一是利用Windows的通信API函數,另一種是採用Microsoft的MSComm控制項。利用 API編寫串口通信程序較為復雜,需要掌握大量通信知識,其優點是可實現的功能更強大,應用面更廣泛,更適合於編寫較為復雜的低層次通信程序。而利用 MSComm控制項則相對較簡單,該控制項具有豐富的與串口通信密切相關的屬性及事件,提供了對串口的各種操作。 一、MSComm控制項的主要屬性及事件 (1)CommPort:設置或返回串列埠號,預設為1。 (2)Setting:設置或返回串口通信參數,格式為「波特率,奇偶校驗位,數據位,停止位」。例如:MSComm1.Setting:='9600,n,8,1' (3)PortOpen:打開或關閉串列埠,格式為:MSComm1.PortOpen:={True|False} (4)InBufferSize:設置或返回接收緩沖區的大小,預設值為1024位元組。 (5)InBufferCount:返回接收緩沖區內等待讀取的位元組數,可通過設置該屬性為0來清空接收緩沖區。 (6)RThreshold:該屬性為一閥值,它確定當接收緩沖區內的位元組個數達到或超過該值後就產生代碼為ComEvReceive的OnComm事件。 (7)SThreshold:該屬性為一閥值,它確定當發送緩沖區內的位元組個數少於該值後就產生代碼為ComEvSend的OnComm事件。 (8)InputLen:設置或返回接收緩沖區內用Input讀入的位元組數,設置該屬性為0表示Input讀取整個緩沖區的內容。 (9)Input:從接收緩沖區讀取一串字元。 (10)OutBufferSize:設置或返回發送緩沖區的大小,預設值為512位元組。 (11)OutBufferCount:返回發送緩沖區內等待發送的位元組數,可通過設置該屬性為0來清空緩沖區。 (12)OutPut:向發送緩沖區傳送一串字元。 如果在通信過程中發生錯誤或事件,就會引發OnComm事件,並由CommEvent屬性代碼反映錯誤類型,在通信程序的設計中可根據該屬性值來執行不同的操作。CommEvent屬性值及其含義如下: (1)ComEvSend:值為1,發送緩沖區的內容少於SThreshold指定的值。 (2)ComEvReceive:值為2,接收緩沖區內字元數達到RThreshold指定的值。 (3)ComEvFrame:值為1004,硬體檢測到幀錯誤。 (4)ComEvRxOver:值為1008,接收緩沖區溢出。 (5)ComEvTxFull:值為1010,發送緩沖區溢出。 (6)ComEvRxParity:值為1009,奇偶校驗錯誤。 (7)ComEvEOF:值為7,接收數據中出現文件尾(ASCII碼為26)字元。 二、程序樣例 在Delphi3.0中無法使用MSComm控制項,筆者使用的是Delphi5.0。MSComm控制項是VB中的OCX控制項,首先需要將其添加到 Delphi中,選擇菜單「Component」→「Import ActiveX Control」,在「Import ActiveX」頁內選擇「Microsoft Comm Control」,點擊「Install」安裝,安裝後在「ActiveX」組件板中出現MSComm圖標,即可被使用。有一點要注意,在Object Inspector中MSComm控制項的Input和Output屬性是不可見的,但它們仍然存在,這兩個屬性的類型是OleVariant(Ole萬能變數)。 下面是一接收程序的樣例(主要部分),大家可根據實際需要進行完善。 在Form中放置一Memo控制項用於顯示接收的數據,Combobox1選擇通信參數(Setting屬性值),Combobox2選擇串口(CommPort屬性值),按Button1開始接收數據,按Button2停止接收。 proc
3. Win32 同步串口編程 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:不要建議我非同步讀寫串口,因為我現在問題還沒解決。不知道是不是還需要對串口的參數進行設置。
再說下重點,我的程序可以正常運行的前提是:程序運行之前,用過串口調試助手之類的,也就是說必須要利用別的程序對串口的參數進行設置我的程序才能正常運行。
4. 怎麼實現java中對COM1串口的通信
網路文庫里搜了一下 JAVA 串口 2個關鍵字
1、java實現串口 - Java 實現對 Windows 串口的讀寫 2007-06-18 14:48:49 大中小 Javax.comm 簡介 Javax.comm 是 Sun 公司提
2、Java串口編程 - java 串口編程的指南...一個使用 Java 讀取串口的程序作者: qyjohn 以下是我寫的用 Java 讀取串口的程序,應一些網友的要求在這里貼出來。