|
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
|
|
|
|
|
Hello everyone,
String of STL does not contain trim/toupper/tolower, currently I always implement them manually. For trim, I use find first/last not of space technique, and for toupper/tolower, I always change them manually by adding some value to 'a' to form 'A' or vice versa.
My question is I want to find some best practices to implement them (one reason is I think my private implementation may be error prone and the other reason is I am not sure whether there is existing APIs which could be utilized) and comment about my current implementation issues.
thanks in advance,
George
|
|
|
|
|
George_George wrote: For trim, I use find first/last not of space technique, and for toupper/tolower, I always change them manually by adding some value to 'a' to form 'A' or vice versa.
My question is I want to find some best practices to implement them (one reason is I think my private implementation may be error prone and the other reason is I am not sure whether there is existing APIs which could be utilized) and comment about my current implementation issues.
For tolower and toupper use std::transform .
std::string Str = "nibu babu thomas";
std::transform( Str.begin(), Str.end(), Str.begin(), toupper );
std::cout << Str;
Nibu babu thomas
Microsoft MVP for VC++
Code must be written to be read, not by the compiler, but by another human being.
Programming Blog: http://nibuthomas.wordpress.com
|
|
|
|
|
Thanks Nibu!
How about trim? No built-in APIs?
regards,
George
|
|
|
|
|
George_George wrote: How about trim? No built-in APIs?
I couldn't find one for std::string , but here is a simple routine using std functions you mentioned in your first post...
void Trim( const std::string& StrToTrim, std::string& TrimmedString )
{
std::string::size_type First = StrToTrim.find_first_not_of( ' ' );
std::string::size_type Last = StrToTrim.find_last_not_of( ' ' ) + 1;
TrimmedString = StrToTrim.substr( First, Last - First );
}
int main()
{
std::string StrToTrim = " 32 Nibu babu thomas 2342 2 23 3 ";
std::string TrimmedString = "On return will hold trimmed string";
Trim( StrToTrim, TrimmedString );
return 0;
}
There might be other options that could perform better than this but this one is neat!
Nibu babu thomas
Microsoft MVP for VC++
Code must be written to be read, not by the compiler, but by another human being.
Programming Blog: http://nibuthomas.wordpress.com
|
|
|
|
|
Cool Nibu!
I want to find all possible exception which may be thrown from STL functions, for example, string.substr may throw out of range exception. But such information can not be found from MSDN. Do you have any reference documents?
regards,
George
|
|
|
|
|
George_George wrote: Do you have any reference documents?
Most of them are in the files exception and stdexcept . Note that there is no .h in these file names.
Nibu babu thomas
Microsoft MVP for VC++
Code must be written to be read, not by the compiler, but by another human being.
Programming Blog: http://nibuthomas.wordpress.com
|
|
|
|
|
Thanks Nibu,
1.
No document which describes all possible exceptions may be thrown by a specific STL function, like string.substr?
2.
"the files exception and stdexcept" -- yes, but for a specific STL function like string.substr, how do you check all possible exceptions may be thrown by looking at the file?
regards,
George
|
|
|
|
|
George_George wrote: 1.
No document which describes all possible exceptions may be thrown by a specific STL function, like string.substr?
2.
"the files exception and stdexcept" -- yes, but for a specific STL function like string.substr, how do you check all possible exceptions may be thrown by looking at the file? Smile
I am not sure where you can find them, but here is a more secure version of Trim .
void Trim( const std::string& StrToTrim, std::string& TrimmedString )
{
std::string::size_type First = StrToTrim.find_first_not_of( ' ' );
if( First == std::string::npos )
{
First = 0;
}
std::string::size_type Last = StrToTrim.find_last_not_of( ' ' );
if( Last != std::string::npos )
{
Last = ( Last + 1 ) - First;
}
TrimmedString = StrToTrim.substr( First, Last );
}
Earlier function will throw an out_of_range exception if we gave a string like " " for trimming. This one doesn't.
Nibu babu thomas
Microsoft MVP for VC++
Code must be written to be read, not by the compiler, but by another human being.
Programming Blog: http://nibuthomas.wordpress.com
|
|
|
|
|
Thanks Nibu!
I want to find all possible exception which may be thrown from STL functions, for example, string.substr may throw out of range exception. But such information can not be found from MSDN. Do you have any reference documents?
regards,
George
|
|
|
|
|
As you know that CString have functions for all the above things, I think refering to CString code will help you to understand the best methods.
|
|
|
|
|
Any non-MFC solutions?
regards,
George
|
|
|
|
|
|
Thanks Rajesh,
I want to find all possible exception which may be thrown from STL functions, for example, string.substr may throw out of range exception. But such information can not be found from MSDN. Do you have any reference documents?
regards,
George
|
|
|
|
|
#include <iostream.h>
class Person
{
string name;
int age;
public:
string GetName(void);
int GetAge(void);
Person(string personName,int personAge);
Person(void);
};
int main()
{
Person *person = new Person("Chris",30);
cout << person->GetName() << endl;
cout << person->GetAge() << endl;
Person anotherPerson;
cout << anotherPerson.GetName() << endl;
cout << anotherPerson.GetAge() << endl;
delete person;
return 0;
}
string Person::GetName()
{
return name;
}
int Person::GetAge()
{
return age;
}
Person::Person(string personName,int personAge)
{
name = personName;
age = personAge;
}
Person::Person()
{
name = "Unknown";
age = 0;
} I used to program using C# and learning C++ now. I have some doubts on the above shown program.
1 - Person anotherPerson is declared but not initialized. But still calls to anotherPerson.GetName() worked. How this is happening?
2 - Is there any difference when allocating memory for *person and anotherPerson ?
3 - I know we should delete the pointer variables to claim memory. But AFAIK, there is no need to delete the anotherPerson variable. How it gets removed from memory?
|
|
|
|
|
Christian Flutcher wrote: 1 - Person anotherPerson is declared but not initialized. But still calls to anotherPerson.GetName() worked. How this is happening?
The compiler provides a default constructor for the class. So when you create an object for the class the default constructor gets invoked and the object is initialized.
Christian Flutcher wrote: 2 - Is there any difference when allocating memory for *person and anotherPerson?
Yes. The memory is allocated from heap in case you use new (ie *person), otherwise it is allocated from stack.
Christian Flutcher wrote: 3 - I know we should delete the pointer variables to claim memory. But AFAIK, there is no need to delete the anotherPerson variable. How it gets removed from memory?
The memory allocated is returned to the stack once the object goes out of scope
Somethings seem HARD to do, until we know how to do them.
_AnShUmAn_
modified on Friday, September 5, 2008 1:33 AM
|
|
|
|
|
Thanks
_AnShUmAn_ wrote: Yes. The memory is allocated from heap in case you use new (ie *person), otherwise it is allocated from stack.
Well, so which one is the recommended practice? use pointer variables always and delete after usage or use the normal one which goes to stack?
|
|
|
|
|
Depends really of the situation, sometimes you will need to use pointers so you don't have a choice. I tend to prefer using variables on the stack rather than on the heap when I can. Allocating/deallocating a lot of variables on the heap can lead to memory fragmentation which can be an issue if you tend to do it a lot. Furthermore, the cost (in time) of creating an object on the heap is a bit higher than creating an object on the stack.
|
|
|
|
|
Cedric Moonen wrote: Allocating/deallocating a lot of variables on the heap can lead to memory fragmentation which can be an issue if you tend to do it a lot
Are there any rules which should be considered when instantiating objects? How do you decide where the object should go? I am bit confused
|
|
|
|
|
No, there's no rule for this but in most of the cases, it's not a big problem if you allocate a variable on the heap or on the stack. One point to remember is that variables on the stack will be destroyed when they go out of scope. So, if you have a variable which is local to a function, this variable will be destroyed when the function exits.
Or if you want a simple rule: try to allocate variables on the stack when you can.
|
|
|
|
|
Thanks Cedric. Your help is much appreciated.
|
|
|
|
|
The stack is where memory is allocated for automatic variables within functions. The memory allocated in the stack area is used and reused during program execution. It should be clear that memory allocated in this area will contain garbage values left over from previous usage.
The heap segment provides more stable storage of data for a program; memory allocated in the heap remains in existence for the duration of a program. Therefore, global variables (storage class external), and static variables are allocated on the heap. The memory allocated in the heap area, if initialized to zero at program start, remains zero until the program makes use of it. Thus, the heap area need not contain garbage.
Somethings seem HARD to do, until we know how to do them.
_AnShUmAn_
|
|
|
|
|
_AnShUmAn_ wrote: It should be clear that memory allocated in this area will contain garbage values left over from previous usage.
Correct me if I'm wrong, this may be true in case of Windows, but not for all other OS. That was my experience with Solaris, at least.
Many are stubborn in pursuit of the path they have chosen, few in pursuit of the goal - Friedrich Nietzsche
.·´¯`·->Rajesh<-·´¯`·.
[Microsoft MVP - Visual C++]
|
|
|
|
|
I have never worked on Solaris platform but as for as windows is concerned this is correct
Somethings seem HARD to do, until we know how to do them.
_AnShUmAn_
|
|
|
|
|
_AnShUmAn_ wrote: Therefore, global variables (storage class external), and static variables are allocated on the heap
A small correction. They are actually store in the .data section or .rdata section of the applications.
|
|
|
|