When using the "Bluetooth Serial Port Profile" there are three main issues to overcome: 1. Setting up the Bluetooth connection to make it behave like a serial device and 2. Setting up the serial device 3. Read and write from/to the port When you say you have tried to open the serial device, but it presents itself as "PIM" instead of a serial device, you probably have a problem with the first issue above. To verify this you can try using the Hyperterminal to send and receive the exact same data with the same port settings as you're trying to do in your code. If that test succeeds you can start worrying about your code. Regarding programming for serial communication I have done it quite a lot, but I've never used ::SetCommMask() or ::WaitCommEvent(). I use overlapped mode and I have one worker thread that reads data and another worker thread that sends data. The data to be sent is put in a queue from which the sending thread reads it and calls ::WriteFile(). A semaphore that the sending thread is waiting on with ::WaitForMultipleObjects() is released when a new block of data is added to the send queue. The reading thread issues a read request with a call to ::ReadFile(). Since overlapped mode is used the call will return immediately and the reading thread can wait on the event in the OVERLAPPED struct that will get signalled when data arrives on the port. The read data will be put in a queue and a user defined windows message gets posted to the main thread in order to inform it about the newly received data so it can take proper action. Of course the queues are protected with critical sections. Joseph Newcomer has written a good article about serial port programming here[^]. He uses a slightly different approach than I've described above, but the mind set is very much the same.
"It's supposed to be hard, otherwise anybody could do it!" - selfquote
"High speed never compensates for wrong direction!" - unknown