今天给小车添加速度控制模块最主要的问题就是 UISlider 的返回值 int 型的数据如何转换为 NSString 型数据,然后与串口协议“#2X#”进行组合,即NSString字符串的连接问题。
我的解决方法是,先把 int 型数据转换成其对应的ASC码,即 char 型数据,然后把char型数据转换为 NSString ,最后进行NSString连接。
1,int 转 char。直接进行强制类型转换:char *speedChar=(char)speedInt;Xcode会提示警告,不用理他。生成的speedChar是speedInt对应的ASC码。
2,char 转 NSString。这个比较复杂了。
网上找了很多方法,有直接把char转换为NSString:
NSString *speedValue=[NSString stringWithCString:speedChar encoding:NSUTF8StringEncoding];
这种方法经我验证,对普通的字符串可行,即speedChar=‘a’这种。但是这里的char为ASC码,按这种方法生成的speedValue为空值:0x00000000,方法失败。
还有一种是,把char型数据先转换成NSData,然后再把NSData转换成NSString:
NSData *data=[NSData dataWithBytes:speedChar length:length(speedChar)];
NSString *speedValue=[[NSString alloc] initWithData:data encoding:NSASCIIStringEncoding];
( NSString *result = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];//这句未验证)
这种方法和上一种一样,得到的结果都是空值。
至于我的方法,等下再说。
3,NSString连接。这个网上有三种方法:
NSString* string; // 结果字符串
NSString* string1, string2; //已存在的字符串
1). string = [NSString initWithFormat:@”%@,%@”, string1, string2 ];
2). string = [string1 stringByAppendingString:string2];
3). string = [string stringByAppendingFormat:@”%@,%@”,string1, string2];
这三种方法都会将string1和string2合并,string2接在string1后面。
原帖地址:NSString字符串相加 相连接
最开始我用的第一种方法,因为我认为既然可以合并两个字符串,那也就可以合并三个字符串,于是我写下了:
message=[message initWithFormat:@”%@,%@,%@”,speedHead,speedValue,speedEnd];
但是得到的message是空值,我还以为是只能两个叠加呢,改成两个也不行,于是放弃了。然后我用第二种方法试,成功合并了字符串。这时候,我受到这个函数的启发,写下了下面一句话:
speedValue=[speedValue stringByAppendingString:@”%c”,speedChar];
是不是很熟悉?对,就是根据方法2)创造的char转换NSString的方法,但是Xcode提示错误!不过没关系,我们还有两个方法可以改:
speedValue=[speedValue initWithFormat:@”%c”,speedChar];
speedValue=[speedValue stringByAppendingFormat:@”%c”,speedChar];
第一种方法输出的是空值(现在注意到了,函数格式可能有错误,speedValue应该是NSString),但第三种方法成功把speedChar的ASC码值转换成了对应的NSString对象!
至此,问题得到完美解决。
附源代码:
- – (IBAction)speedController:(UISlider *)sender {
- slider=(UISlider *)sender;
- int speedInt=(int)roundf(slider.value);
- char *speedChar=(char)speedInt;
- NSString *speedValue=[[NSString alloc]init];
- //NSString *speedValue=[NSString stringWithCString:speedOfCar encoding:NSUTF8StringEncoding];
- //NSString *speedValue=[[NSString alloc]initWithData:data encoding:NSASCIIStringEncoding];
- speedValue=[speedValue stringByAppendingFormat:@“%c”,speedChar];
- NSString *speedHead=@“#2”;
- NSString *speedEnd=@“#”;
- NSString *messageHead;
- messageHead=[speedHead stringByAppendingString:speedValue];
- NSString *message;
- message=[messageHead stringByAppendingString:speedEnd];
- NSLog(@“%@”,message);
- }